El compilador de eclipse se niega a compilar el siguiente código, indicando que el campo s no está visible. (El compilador Aspect J de IBM también se niega, afirmando que "no se pudo resolver") ¿Por qué?rareza del compilador de Java: campo declarado en la misma clase, pero "no visible"
public class Test {
String s;
void foo(Object o) {
String os = getClass().cast(o).s;
}
}
La especificación del lenguaje Java afirma:
De lo contrario, nos dicen que no hay defecto acceso, lo cual está permitido sólo cuando el acceso se produce desde dentro del paquete de en la que se declara el tipo.
De la forma en que lo entiendo, el campo se declara y se accede en la misma unidad de compilación, por lo tanto, dentro del mismo paquete, y debe por lo tanto ser accesible.
Aún más extraño, la adición de un abatido ? extends Test
-Test
hace que el campo visible, es decir, el código siguiente se compila:
public class Test {
String s;
void foo(Object o) {
Test t = getClass().cast(o);
String os = t.s;
}
}
¿He tropezado con un error del compilador, o mal entendido el Spec Java?
Editar: Ahora estoy en otra computadora. Aquí, javac acepta el código, pero eclipse aún no lo hace. Versiones de esta máquina:
plataforma Eclipse
Versión: 3.4.2 Build ID: M20090211-1700
JDK 1.6.0
Editar 2 De hecho, javac acepta el código. Lo había probado ejecutando la compilación Ant, que usa el compilador Ascpect J de IBM ...
problema de kewl. ¿Dónde está Josh Bloch? –