2009-04-16 93 views
7

谁是对的? Eclipse还是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 

回答

7

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

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

§6.6.1: 只能访问引用(类,接口或数组)类型或类类型构造函数的成员(类,接口,字段或方法)如果该类型可访问且成员或构造函数声明为允许访问:

  • 如果成员或构造函数声明为public,则允许访问。接口的所有成员都是隐式公开的。 [...]
    • 否则,如果成员或构造被声明私人,那么访问是当且仅当顶层类的主体内发生时(第7.6节),其包围的声明允许成员或构造函数。

如此以来,类类别是不是类的体内,B.Secret是不是在这个位置访问,所以A<B.Secret>不入店,所以应该发生编译时错误。

+0

我认为这个答案是正确的,尽管JLS对顶级课程的限制是愚蠢的。访问OUGHT以扩展到顶级类的类声明(特别是类型参数)。 – Eric 2009-04-17 00:22:30

3

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

A<B.Secret> 

通用需要有权访问它使用的类。 B然后扩大这个班的事实是微不足道的。

6

Eclipse错了。如果你做广告的东西作为

extends A<X> 

你既需要了解A,和X

相关问题