2009-04-16 117 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

相關問題