当运行以下代码时,会按照语言规范的要求打印“X.Q”而不是“A
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(); } }
有些人可以帮助我了解这个程序的输出是什么,根据我的理解,应该是“A< T> .X.Q”而不是“X.Q”,请纠正我,如果我错了一些
解决方法
您收到“X.Q”的原因是X指的是X范围限定为未命名的包,而不是A< T> .X.在B之后声明“外部”X并不重要,因为Java编译器在解析B.Y的基类的名称之前看到它.
您可以在代码中强制从A.X继承如下:
class B extends A<B.Y.Q> { static class Y extends A.X { } // ^^ // Add this }
编辑:(感谢user695022的评论)
奇怪的是,如果外部类不是通用的,则问题消失:
class A { static class X { static class Q { public static void main() { System.out.println("A<T>.X.Q"); } } } }