2009-04-16 4 views
7

Wer hat Recht? Eclipse oder Javac?Fehler in Eclipse Compiler oder 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-kompiliert B.java just fine.

Javac hat ein Problem.

$ 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 

Antwort

7

Die relevanten Teile des Java Language Specification sein muss:

§8.1.4: [... ] Der ClassType muss einen zugänglichen (§6.6) Klassentyp benennen oder es tritt ein Fehler bei der Kompilierung auf.

§6.6.1: [...] Element (Klasse, Schnittstelle, Feld, oder das Verfahren) eines Verweises (Klasse, Interface oder Array) Typ oder ein Konstruktor für eine Klasse-Typ ist nur zugänglich Wenn auf den Typ zugegriffen werden kann und das Mitglied oder der Konstruktor für den Zugriff deklariert ist:

  • Wenn das Mitglied oder der Konstruktor als public deklariert ist, ist der Zugriff zulässig. Alle Mitglieder von Schnittstellen sind implizit öffentlich. [...]
    • Andernfalls, wenn das Mitglied oder Konstruktor privat deklariert ist, so wird der Zugriff erlaubt, wenn und nur wenn sie innerhalb des Körpers der Top-Level-Klasse auftritt (§7.6), dass die Erklärung des umschliesst Mitglied oder Konstruktor. So

da der Classtype nicht innerhalb des Körpers der Klasse ist, ist B.Secret an diesem Ort nicht zugänglich, so A<B.Secret> nicht zugänglich ist, so dass ein Fehler bei der Kompilierung auftreten sollte.

+0

Ich denke, diese Antwort ist korrekt, obwohl die Beschränkung auf den Körper der Top-Level-Klasse durch die JLS ist albern. Greifen Sie auf OUGHT zu, um auf die Klassendeklaration (und insbesondere die Typparameter) der Top-Level-Klasse zu erweitern. – Eric

3

Ich würde dazu neigen, javac ist Recht zu denken. Um eine neue Klasse zu erstellen, muss der generische Zugriff auf die Klasse, die er verwendet, erfolgen. Die Tatsache, dass B diese Klasse dann erweitert, ist gering.

6

Eclipse ist falsch. Wenn Sie etwas wie

extends A<X> 

werben müssen Sie sowohl über A wissen, und X.