以下类包含一个用匿名内部类的实例初始化的成员变量runnable
。内部类引用相同的部件:为什么Java 8中的lambdas不允许向匿名类不提供成员变量的前向引用?
class Example {
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println(runnable);
}
};
}
这只要构件已经被分配和JLS允许这样的引用之前不执行该方法是没有问题的。用下面的
Runnable runnable =() -> System.out.println(runnable);
据我所知,这在功能上等同于前面的例子,但它也被拒绝通过javac 1.8.0_05
:
成员变量的声明理论上可以转化成lambda表达式这样错误信息:
Error:(2, 54) java: self-reference in initializer
虽然该陈述是真实的,但我不明白为什么这是不允许的。这是故意不允许的,也许是因为lambda表达式被编译为不同的字节码,如果允许,会导致问题?或者仅仅因为在匿名内部类中使用这些引用时存在问题而被禁止使用?还是无意中被JLS作者拒绝?或者它是javac
中的一个错误?
在eclipse中,这个工程:'Runnable runnable =() - > System.out.println(this。runnable);'只有在添加'this'限定符后才会失败。 –