为什么我们不能在lambda表达式中使用默认方法?
我正在阅读有关Java
8的教程,作者在其中显示了代码:
interface Formula { double calculate(int a);
default double sqrt(int a) {
return Math.sqrt(a);
}
}
然后说
无法从lambda表达式内访问默认方法。以下代码无法编译:
Formula formula = (a) -> sqrt( a * 100);
但是他没有解释为什么这是不可能的。我运行了代码,但出现了错误,
不兼容的类型:公式不是功能界面`
回答:
这或多或少是范围的问题。从JLS
与出现在匿名类声明中的代码不同,在lambda正文中出现的名称和
this
and
super
关键字的含义以及引用声明的可访问性与周围上下文相同(除了lambda参数引入新名称)。
在您尝试的示例中
Formula formula = (a) -> sqrt( a * 100);
范围不包含名称声明sqrt
。
JLS也暗示了这一点
(以递归方式调用其自身或调用其其他方法)
,而使用名称来引用封闭类中的东西则更为常见。否则会被阴影(
this
,toString()
)遮盖。
我认为它可能已经实施。他们选择不允许。
以上是 为什么我们不能在lambda表达式中使用默认方法? 的全部内容, 来源链接: utcz.com/qa/405703.html