Java cómo el orden de importación importa cuando la clase de importación / enumeración interior una clase interna

Pepe Lu.

Aquí está mi clase:

package pepelu;

import pepelu.ImportTest.InnerClass.InnerEnum;
import javax.annotation.Resource;

public class ImportTest {
    @Resource
    public static class InnerClass {
        public enum InnerEnum {
            A
        }
    }

    public static void main(String[] args) {
        System.out.println(InnerEnum.A);
    }
}

Cuando uso Maven para construir, se le dará un error de compilación:

mvn clean compile

[ERROR] /Users/finup/Desktop/a/importtest/src/main/java/pepelu/ImportTest.java:[8,6] no puede encontrar el símbolo

Después de cambiar el orden de importación de:

import javax.annotation.Resource;
import pepelu.ImportTest.InnerClass.InnerEnum;

Tengo una correcta construcción experta.

Busqué documentos, pero no puedo encontrar una explicación para esto.

¿Podría alguien por favor explicar cómo funciona la importación en este caso?

GhostCat saludos Monica C.:

Supongo que la razón es una dependencia "circular": usted tiene algún elemento Xque importar dentro del mismo archivo / clase en la que se está definiendo.

Sentido:

import pepelu.ImportTest.InnerClass.InnerEnum;

en realidad se refiere al siguiente código en el mismo archivo:

public static class InnerClass {
    public enum InnerEnum {

Esto significa que: para el compilador, con el fin de procesar esa importación, que tiene que mirar en el cuerpo de la clase en el mismo archivo.

Parece que hace que javac "inmediatamente". Significado: comienza la lectura de las declaraciones de importación, y la importación de la misma clase hace que sea "suspender" mirar a las importaciones, pero la salida a la siguiente definición de clase.

Y adivinen qué: que hace que la definición de clase utilizan de otra importación. Con el fin de "proceso" la definición de esa enumeración, el compilador tiene que entender que / lo que @Resource anotación se trata. Pero no sabe la anotación todavía (porque el compilador no vio la importación, sin embargo).

Cuando se cambia el orden, el compilador entiende que el uso @Resource en la definición de clase.

Y, por supuesto: la verdadera respuesta es no a las importaciones de reabastecimiento. La verdadera respuesta es no importar algo de la clase que está siguiendo luego de las declaraciones de importación. No hay absolutamente ninguna razón para hacerlo.

Editar, dada la observación de la OP sobre cómo esto puede funcionar en redisson : honestamente, no sé. Se podría depender de cómo es exactamente esa clase se compila. Tal vez este tipo de código funciona con las versiones más recientes (o más) de javac, tal vez esto funciona con las versiones específicas del Eclipse o IntelliJ o compilador XYZ.

Significado: Te di una explicación de por qué se está ejecutando en este problema. Eso no quiere decir que cualquier compilador debe necesariamente encontrarse con el mismo problema.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=179949&siteId=1
Recomendado
Clasificación