多级静态嵌套类产生错误输出

Jok*_*ker 11 java inner-classes

运行以下代码时,将打印"X.Q"而不是"A<T>.X.Q"按语言规范的要求进行打印.

    class A<T> {
    static class X {
        static class Q {
            public static void main() {
                System.out.println("A<T>.X.Q");
            }
        }
    }
}

class B extends A<B.Y.Q> {
    static class Y extends X {
    } // X here is inherited from A
}

class X {
    static class Q {
        public static void main() {
            System.out.println("X.Q");
        }
    }
}

public class Test {
    public static void main(String[] args) {
        B.Y.Q.main();
    }
}
Run Code Online (Sandbox Code Playgroud)

有人可以帮助我理解这个程序的输出是什么,根据我的理解它应该是"A<T>.X.Q" 代替 "X.Q",如果我错了,请纠正我

das*_*ght 5

"X.Q"打印的原因是X指的是X作用于未命名包的类,而不是A<T>.X.之后X声明"外部"并不重要,因为Java编译器在解析基类的名称之前会看到它. BB.Y

您可以A.X在代码中强制继承,如下所示:

class B extends A<B.Y.Q> {
    static class Y extends A.X {
    } //                   ^^
      //                Add this
}
Run Code Online (Sandbox Code Playgroud)

演示1.

编辑:(感谢用户695022的评论)

奇怪的是,如果外部类不是通用的,问题就会消失:

class A {
    static class X {
        static class Q {
            public static void main() {
                System.out.println("A<T>.X.Q");
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

演示2.

  • @ user695022:这很有趣,因为继承然后DO在分辨率中起作用.这根本不直观.谢谢. (2认同)