谁是对的? Eclipse 还是 javac?
-------------- c/v/A.java ---------------
package c.v;
public class A<T> {
}
-------------- c/v/B.java ---------------
package c.v;
public class B extends A<B.Secret> {
private class Secret {};
}
Eclipse 编译 B.java 就可以了。
Javac 有问题。
$ javac c/v/B.java c/v/B.java:3:c.v.B.Secret 在 c.v.B 中具有私有访问权限 公共类 B 扩展 A{ ^ 1 个错误
Java 语言规范的相关部分必须是:
§8.1.4: [...] ClassType 必须命名可访问的(第 6.6 节)类类型,否则会发生编译时错误。
§6.6.1: [...] 仅当类型可访问并且声明成员或构造函数允许访问时,引用(类、接口或数组)类型的成员(类、接口、字段或方法)或类类型的构造函数才可访问:
因此,由于 ClassType 不在类的主体内,因此在此位置无法访问
B.Secret
,因此 A<B.Secret>
不可访问,因此应该会发生编译时错误。
Eclipse 是错误的。如果您将某物做广告
extends A<X>
你需要了解 A 和 X。
我倾向于认为 javac 是正确的。为了创建一个新班级
A<B.Secret>
泛型需要访问它使用的类。 B 随后扩展该类的事实是次要的。