我正在解决一些Java难题,偶然发现了这个:
public class Outer {
class Inner1 extends Outer {}
class Inner2 extends Inner1 {}
}
在用javac 1.6.0_45
编译这段代码时,不出所料,我得到了这个错误:
Outer.java:8: cannot reference this before supertype constructor has been called
class Inner2 extends Inner1 {}
^
这是因为编译器使用类似的代码为Inner2
类生成默认构造函数,这解释了上面的错误:
Inner2 () {
this.super();
}
现在很明显了,因为你真的不能在JavaJLS8.8.7.1中做到这一点(正如我所猜测的那样):
构造函数体中的显式构造函数调用语句不能引用该类或任何超类中声明的任何实例变量或实例方法,也不能在任何表达式中使用this或super;否则,将发生编译时错误。
请参见(Odd situation for "cannot reference this before supertype constructor has been called"中的accepted answer)
但是如果我尝试用javac 1.7.0_79
编译它-它是可以的!
问题来了--在Java1.7中做了什么改变,这段代码现在是正确的吗?
提前感谢!
发布于 2016-03-09 11:20:20
看起来在Java bug跟踪器上讨论了与bug JDK-6708938: Synthetic super-constructor call should never use 'this' as a qualifier相同的问题。
此外,我认为这将是很棒的,你可以看看之前的其他相关问题,例如JDK-4903103: Can't compile subclasses of inner classes 。
请注意这两个bug的修复版本。
其结果见Maintenance Review of JSR 901 (Java Language Specification) for Java SE 7。
来自The Java Language Specification Third Edition
否则,S
是一个内部成员类(§8.5)。如果S
不是词法封闭类的成员,或者不是其超类或超接口的成员,则它是编译时错误。设O
是S
是其成员的最内层的词法封闭类,n是整数,使得O
是C
的第n个词法封闭类。与S
相关的紧随其后的i
实例是它的第n个词法封闭实例。
和来自JSR901 (Java Language Specification) for JavaSE7(完整版,第242页,蓝色文本)的维护审查或The Java Language Specification, Java SE 7 Edition中的相同内容(恰好在8.8.8节之前)
否则,S是内部成员类(§8.5)。
设O是S的最内层词性封闭类,n是整数,使得O是C的第n个词性封闭类。
I相对于S的直接封闭实例是this的第n个词汇封闭实例。
所以你可以看到有编译时错误的部分已经消失了。
发布于 2016-03-09 02:02:42
我怀疑这与invoke dynamic有关,它是在Java1.7中添加的,目的是为Java8中的lambda做准备。
https://stackoverflow.com/questions/35853023
复制相似问题