Java 内部类的奇怪编译错误
以下代码按预期编译:Java 内部类的奇怪编译错误,java,compiler-errors,inner-classes,Java,Compiler Errors,Inner Classes,以下代码按预期编译: class A { class B {} class C extends B {} } 但是,如果我们有类B扩展类A,我们会收到一个编译错误: class A { class B extends A {} class C extends B {} // <-- Error here } A类{ 类B扩展了{} 类C扩展了B{}/,因为B不是静态的,所以它需要A的某个实例才能存在,从而导致错误 如果B是静态的,则错误消失 啊,忘了废
class A {
class B {}
class C extends B {}
}
但是,如果我们有类B
扩展类A
,我们会收到一个编译错误:
class A {
class B extends A {}
class C extends B {} // <-- Error here
}
A类{
类B扩展了{}
类C扩展了B{}/,因为B
不是静态的,所以它需要A
的某个实例才能存在,从而导致错误
如果B
是静态的,则错误消失
啊,忘了废话吧。它是一个,在Java7模式下工作。但是,在Java7之前,它不工作-,你也需要这样做
将B更改为静态
添加构造函数
C() {
A.this.super();
}
然后它就会起作用
在Java 7之前发生这种情况的原因可能是来自JLS的以下原因:
让C成为被实例化的类,让我们成为C的直接超类,让我成为被创建的实例
隐式super
在关于S的i的直接封闭实例上调用
在中,立即封闭的实例定义为
设O是S为成员的最里面的词汇封闭类,设n为整数,使得O是C的第n个词汇封闭类。i关于S的直接封闭实例是该类的第n个词汇封闭实例
然而,在:
设O是S的最内层词汇封闭类,n是一个整数,使得O是C的第n个词汇封闭类
i关于S的直接封闭实例是这个的第n个词汇封闭实例
因此,在过去,它是S所属的最内层词汇封闭类,而现在它是最内层词汇封闭类,所以它从C
变为a
,因此代码在Java 7中工作。这是一个递归。
如果B扩展了A,A本身有一个新的B,那么B将再次扩展A,依此类推
正如@ZiyaoWei所提到的,当B是静态的时候,错误就会消失。那是因为B类只会存在一次。第二次类似于再次调用它自己,这会导致它无限递归地调用它自己。请忘记所有的废话-这是一个bug。Javac在这种情况下工作得很好。我编辑了my答案。@ZiyaoWei这在IntelliJJavac 7中也不起作用,如果不起作用,添加构造函数会有帮助。Dupe found-,但此后情况发生了变化,因此我不会将其标记为Dupe。仍在尝试查找相关信息。从JLS 7中找到引用,请参阅我编辑的答案。
C() {
A.this.super();
}