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();
    }