sintactico semantico lexico jflex hecho hacer descargar descarga compilador como codigo basico analizador java

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: