2012-08-01 11 views
12

Duplicar posible:
Type-parameterized field of a generic class becomes invisible after upgrading to Java 7¿Por qué el campo privado de un parámetro es visible para un método genérico en Java 6 pero no en Java 7?

public class Test{ 

    private String _canYouSeeMe = "yes"; 

    <T extends Test> void genericMethod(T hey){ 
     String s = hey._canYouSeeMe; 
    } 

    void method(Test hey){ 
     String s = hey._canYouSeeMe; 
    } 
} 

Cuando se construye contra el JDK 1.6 Esto compila bien, pero frente al 1,7 hay un error de compilación en genericMethod(): la prueba de campo. _canYouSeeMe no está visible

El error se puede resolver haciendo que _canYouSeeMe esté protegido en lugar de lo privado, pero me pregunto lo que ha cambiado de 1.6 a 1.7

+2

error o una advertencia? – kosa

+0

¿por qué no? este es un método de la misma clase, ¿no? y no estático, también. – Qnan

+0

@fmucar Compilado bien aquí con openjdk 1.6.0_24. –

Respuesta

7

subclases (T) de una clase (Test) no tienen acceso a los campos privados superclase. Esto fue probablemente un error en el compilador de Java 6, que se fijó en Java 7.

Recuerde: T extends Test significa que T es una subclase de Test. Lo hace no significa que la clase T es Test.class, que es la condición necesaria para tener acceso de método de campo privado &.

+0

esto es parcialmente cierto, pero como el código que accede al campo privado está en la superclase, diría que debería tener el acceso – Qnan

+2

@Matt: no lo entiendo. Si eso fuera cierto, ¿por qué el lanzamiento de 'hey' a' Test' (que es completamente legítimo y ni siquiera produce una advertencia) nos permite acceder a '_canYouSeeMe'? –

+0

+1 Una serie de errores en Java 6 no se corrigieron hasta Java 7 para evitar causar una incompatibilidad. –

1

En respuesta a @Joachim: demasiado tiempo para un comentario.

Es consistente con el hecho de que esto no sería compilar:

void method(SubTest hey) { 
    String s = hey._canYouSeeMe; 
} 

(donde se extiende subprueba de prueba), mientras que esto sería compilar

void method(SubTest hey) { 
    String s = ((Test) hey)._canYouSeeMe; 
} 
+0

El segundo ejemplo no se compila (en Java 6 y 7) cuando 'SubTest' es una clase de nivel superior. –

+0

@MattBall: ¿por qué no? siempre y cuando 'SubTest' extienda' Test'. Compila para mí. –

+0

@MattBall si 'method' es un miembro de Test, se compila, incluso si' SubTest' es una clase de nivel superior. – assylias

Cuestiones relacionadas