semantico - ¿Por qué el compilador Java(específicamente su analizador) no es capaz de entender esta declaración?
compilador jflex java (3)
Tengo las siguientes dos clases (en dos archivos separados).
public class Foo
{
public static class A
{
public static final boolean FLAG = false;
}
public final A A = new A();
}
public class Bar
{
void method()
{
if (Foo.A.FLAG) <<<< this is giving "Cannot make static ref to non-static field
// do something
;
}
}
Mi pregunta es, ¿por qué el compilador no puede reconocer que por Foo.A
me refiero a la clase A
, no al miembro, que también recibe el nombre de A
?
Algunas formas de acceder a la bandera:
<Foo_A extends Foo.A> void test1()
{
if(Foo_A.FLAG)
;
}
void test2()
{
class Foo_A extends Foo.A{}
if(Foo_A.FLAG)
;
}
-------------------------------------
import pkg.Foo.A;
public class Bar
{
void test3()
{
if(A.FLAG)
;
}
}
en estos contextos, "Foo.A"
solo puede interpretarse como un tipo, no como una variable.
Esto se llama obscuring , una característica / limitación oscura de Java
Un nombre simple puede aparecer en contextos donde potencialmente puede interpretarse como el nombre de una variable, un tipo o un paquete. En estas situaciones, las reglas de §6.5 especifican que una variable se elegirá con preferencia a un tipo , y que un tipo se elegirá con preferencia a un paquete. Por lo tanto, a veces es imposible referirse a un tipo visible o declaración de paquete a través de su nombre simple. Decimos que dicha declaración está oscurecida.
Si la variable A
era static
, se compilaría, ya que puede acceder a miembros static
en referencias de objetos.
Tampoco se ha inicializado FLAG
.
Porque las clases internas requieren una instancia del tipo envolvente. Si no tienes una instancia de Foo, A no existe.
Editar: esto es incorrecto, pero la razón es informativa. Vea los comentarios a continuación: