【问题标题】:Bug in eclipse compiler or javac?Eclipse 编译器或 javac 中的错误?
【发布时间】:2009-04-16 19:15:53
【问题描述】:

谁是对的? 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 个错误

【问题讨论】:

    标签: eclipse generics compiler-construction javac


    【解决方案1】:

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

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

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

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

    因此,由于 ClassType 不在类的主体中,B.Secret 在此位置不可访问,因此 A&lt;B.Secret&gt; 不可访问,因此会出现编译时错误。

    【讨论】:

    • 我认为这个答案是正确的,尽管 JLS 对顶级课程主体的限制是愚蠢的。访问应该扩展到顶级类的类声明(特别是类型参数)。
    【解决方案2】:

    Eclipse 是错误的。如果您将某事宣传为

    extends A<X>
    

    您需要同时了解 A 和 X。

    【讨论】:

      【解决方案3】:

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

      A<B.Secret>
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-18
        • 2020-12-29
        • 2011-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多