2009-04-16 10 views
7

¿Quién tiene razón? Eclipse o javac?Error en el compilador de eclipse o 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 compila B.java bien.

Javac tiene un problema.

$ 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 

Respuesta

7

Las partes pertinentes de la Java Language Specification deben ser:

§8.1.4: [... ] ClassType debe nombrar un tipo de clase accesible (§6.6) o se produce un error en tiempo de compilación.

§6.6.1: [...] Un miembro (clase, interfaz, un campo o método) de una referencia (clase, interfaz o array), escriba o un constructor de un tipo de clase sólo es accesible si el tipo es accesible y el miembro o constructor está declarado para permitir el acceso:

  • Si el miembro o constructor se declara público, se permite el acceso. Todos los miembros de las interfaces son implícitamente públicos. [...]
    • De lo contrario, si el miembro o constructor se declara privada, entonces se permite el acceso si y sólo si se produce dentro del cuerpo de la clase de nivel superior (§7.6) que encierra la declaración de la miembro o constructor.

Así que desde el ClassType no está dentro del cuerpo de la clase, B.Secret no es accesible en este lugar, por lo A<B.Secret> no es accesible, por lo que debe ocurrir un error en tiempo de compilación.

+0

Creo que esta respuesta es correcta, aunque la restricción al cuerpo de la clase de nivel superior por el JLS es tonta. Acceda OUGHT para extender a la declaración de clase (y específicamente a los parámetros de tipo) de la clase de nivel superior. – Eric

3

yo tendería a pensar javac es correcto. Para crear una nueva clase

A<B.Secret> 

, el genérico necesita tener acceso a la clase que utiliza. El hecho de que B luego amplíe esa clase es menor.

6

Eclipse está mal. Si se anuncia algo tan

extends A<X> 

necesita tanto debe saber sobre A, y X.

Cuestiones relacionadas