为什么我们不能在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正文中出现的名称和thisand

super关键字的含义以及引用声明的可访问性与周围上下文相同(除了lambda参数引入新名称)。

在您尝试的示例中

Formula formula = (a) -> sqrt( a * 100);

范围不包含名称声明sqrt

JLS也暗示了这一点

(以递归方式调用其自身或调用其其他方法)

,而使用名称来引用封闭类中的东西则更为常见。否则会被阴影(thistoString())遮盖。

我认为它可能已经实施。他们选择不允许。

以上是 为什么我们不能在lambda表达式中使用默认方法? 的全部内容, 来源链接: utcz.com/qa/405703.html

回到顶部