eclipse编译器或javac中的错误?

Eri*_*ric 7 eclipse compiler-construction generics javac

谁是对的?Eclipse还是javac?

--------------- c/v/A.java ---------------

package c.v;
public class A<T> {
}
Run Code Online (Sandbox Code Playgroud)

--------------- c/v/B.java ---------------

package c.v;
public class B extends A<B.Secret> {
  private class Secret {};
}
Run Code Online (Sandbox Code Playgroud)

Eclipse编译B.java就好了.

Javac有问题.

$ javac c/v/B.java
c/v/B.java:3: c.v.B.Secret has private access in c.v.B
public class B extends A<B.Secret> {
                           ^
    1 error

Ras*_*ber 7

Java语言规范的相关部分必须是:

§8.1.4:[...] ClassType必须命名一个可访问的(§6.6)类类型,否则会发生编译时错误.

§6.6.1:[...]引用(类,接口或数组)类型的成员(类,接口,字段或方法)或类类型的构造函数只有在类型可访问时才可访问声明成员或构造函数允许访问:

  • 如果成员或构造函数被声明为public,则允许访问.接口的所有成员都是隐式公共的.[...]
    • 否则,如果成员或构造函数被声明为private,则当且仅当它发生在包含成员或构造函数声明的顶级类(第7.6节)的主体内时才允许访问.

因此,由于ClassType不在类的主体内,B.Secret因此无法在此位置访问,因此A<B.Secret>无法访问,因此应发生编译时错误.


Var*_*han 6

Eclipse错了.如果你做广告的话

extends A<X>
Run Code Online (Sandbox Code Playgroud)

你需要知道A和X.