最近,我在匿名类和lambda表达式之间发现了一个微妙的区别:
public class FinalTest {
final Runnable x = new Runnable() {
@Override
public void run() {
System.out.println(x.hashCode());
}
};
final Runnable y = () -> System.out.println(y.hashCode());
}通常lambda等同于匿名类。甚至我的Eclipse也进行了重构,将x转换为lambda (它与y完全一样),并将y转换为匿名类(它与x完全一样)。然而,lambda给了我一个编译错误,而匿名类可以完全编译。错误消息如下所示:
>javac FinalTest.java
FinalTest.java:9: error: self-reference in initializer
final Runnable y = () -> System.out.println(y.hashCode());
^
1 error所以问题是:为什么会有这么大的差别?
发布于 2015-05-08 18:14:10
这与JLS #8.3.3处理前向引用有关。特别是,如果使用完全限定的名称,它会编译(因为该规则的第三个条件变为假,所以在C的实例变量初始化程序或C的实例初始化程序中,使用都是一个简单的名称):
final Runnable y = () -> System.out.println(this.y.hashCode());对于匿名类,第四个条件(C是封装使用的最内部类或接口)是不正确的,因为封闭类本身就是匿名类。
https://stackoverflow.com/questions/30130148
复制相似问题