根据JLS 15.27.2,lambda主体与周围的上下文具有相同的范围,我想知道是否有一个特定的原因来解释为什么lambda实现的接口的默认方法不是'身体内也可以吗?这种限制是否可以实现某些优化,还是只是为了简化过载规则?
我今天正在对一些Java 8 API进行原型设计,当我遇到这个限制时,我非常失望,因为使用默认方法可以让我以非常优雅和非侵入的方式实现该API。
通过要求静态导入或多或少可以实现相同的优点,但这会导致污染"命名空间。
是否有可能取消此限制?
答案 0 :(得分:3)
lambda无法使用默认方法,因为在将lambda分配给函数类型之前,尚未为其指定类型。例如,lambda
s -> s.isEmpty()
可以分配给java.util.function.Predicate
或com.google.common.base.Predicate
。因此,通过将lambda作为{{java.util.function.Predicate
直接赋值给java.util.function.Predicate
,它无法访问java.util.function.Predicate
的默认方法。 1}}参数,从返回类型为java.util.function.Predicate
的函数返回它,或者只是将其转换为java.util.function.Predicate
,如下所示:
java.util.function.Predicate
考虑它的一种方法类似于装箱((Predicate<String>) s -> s.isEmpty()).negate(); // negate is a default method on Predicate
值。 int
的方法不能在文字整数值上调用,但是一旦将整数值赋给Integer
类型,就可以调用它的方法。