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",如果我错了,请纠正我
您"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)
编辑:(感谢用户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)