eclipse编译器或javac中的错误?

时间:2009-04-16 19:15:54

标签: eclipse generics compiler-construction javac

谁是对的? 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 has private access in c.v.B
public class B extends A<B.Secret> {
                           ^
    1 error

3 个答案:

答案 0 :(得分:7)

Java Language Specification的相关部分必须是:

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

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

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

因为ClassType不在类的主体内,所以在这个位置无法访问B.Secret,所以A<B.Secret>是不可访问的,因此应该发生编译时错误。

答案 1 :(得分:6)

Eclipse错了。如果您宣传某些内容

extends A<X>

你需要知道A和X.

答案 2 :(得分:3)

我倾向于认为javac是对的。为了创建一个新类

A<B.Secret>

泛型需要访问它使用的类。 B然后扩展该类的事实很小。