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

前端之家收集整理的这篇文章主要介绍了java – 多级静态嵌套类产生错误的输出前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
当运行以下代码时,会按照语言规范的要求打印“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
}

Demo 1.

编辑:(感谢user695022评论)

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

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

Demo 2.

猜你在找的Java相关文章