Question Javac ne parvient pas à compiler des annotations sur les classes imbriquées statiques qui ont une énumération publique


J'ai rencontré l'échec de compilation javac suivant, où javac n'a pas reconnu les annotations sur une classe imbriquée statique comportant un énumération publique. Une fois que j'ai déplacé l'énum de la classe imbriquée statique, les erreurs de compilation ont été résolues. Est-ce que quelqu'un sait pourquoi Javac a échoué? Est-ce un bug du compilateur Java? Ou existe-t-il une nuance java que je ne connais pas?

Vous trouverez ci-dessous un cas de test autonome.

Ne compile pas:

package test;

import test.AnnotationBug.NestedClassWithEnum.ParticipantType;

import lombok.Data;
import lombok.NoArgsConstructor;

import com.googlecode.objectify.annotation.Embed;

public class AnnotationBug {

  ParticipantType type;

  @Embed
  @Data
  @NoArgsConstructor
  public static final class NestedClassNoEnum {
  }

  @Embed
  @Data
  @NoArgsConstructor
  public static final class NestedClassWithEnum {
    ParticipantType type;

    public enum ParticipantType {
      ORGANIZER,
      REGISTERED,
      WAIT_LISTED
    }
  }
}

Sortie de compilation:

$ javac -classpath /home/avaliani/projects/jars/objectify-4.0b2.jar:/home/avaliani/projects/jars/lombok.jar  test/AnnotationBug.java
test/AnnotationBug.java:20: error: cannot find symbol
  @Embed
   ^
  symbol:   class Embed
  location: class AnnotationBug
test/AnnotationBug.java:21: error: cannot find symbol
  @Data
   ^
  symbol:   class Data
  location: class AnnotationBug
test/AnnotationBug.java:22: error: cannot find symbol
  @NoArgsConstructor
   ^
  symbol:   class NoArgsConstructor
  location: class AnnotationBug

Compile:

package test;

// import test.AnnotationBug.NestedClassWithEnum.ParticipantType;

import lombok.Data;
import lombok.NoArgsConstructor;

import com.googlecode.objectify.annotation.Embed;

public class AnnotationBug {

  ParticipantType type;

  @Embed
  @Data
  @NoArgsConstructor
  public static final class NestedClassNoEnum {
  }

  @Embed
  @Data
  @NoArgsConstructor
  public static final class NestedClassWithEnum {
    ParticipantType type;

  }

  public enum ParticipantType {
    ORGANIZER,
    REGISTERED,
    WAIT_LISTED
  }
}

Compile sans erreurs:

$ javac -classpath /home/avaliani/projects/jars/objectify-4.0b2.jar:/home/avaliani/projects/jars/lombok.jar  test/AnnotationBug.java

Choses à signaler:

1) Notez le numéro de ligne de l’échec de la compilation. Il n'y a pas de problème à analyser les annotations de NestedClassNoEnum.

2) version Java:

$ java -version
java version "1.7.0_21"
OpenJDK Runtime Environment (IcedTea 2.3.9) (7u21-2.3.9-0ubuntu0.12.10.1)
OpenJDK 64-Bit Server VM (build 23.7-b01, mixed mode)

14
2018-05-21 20:48


origine


Réponses:


Si vous supprimez l’importation de la classe statique, le code se compile correctement, voir le code ci-dessous

//import NestedClassWithEnum.ParticipantType;
import lombok.Data;
import lombok.NoArgsConstructor;


public class AnnotationBug {

    NestedClassWithEnum.ParticipantType type;


    @Data
    @NoArgsConstructor
    public static final class NestedClassNoEnum {
    }


    @Data
    @NoArgsConstructor
    public static final class NestedClassWithEnum {
        ParticipantType type;

        public enum ParticipantType {
            ORGANIZER,
            REGISTERED,
            WAIT_LISTED
        }
    }
}

La raison semble être liée au chargement de classe des enumns et des classes statiques. Enums sont chargés avec impatience où les classes statiques sont chargées paresseusement. Donc, java pourrait essayer de s’arrêter au moment de la compilation lui-même, mais c’est une supposition.

MODIFIER: Selon la discussion avec Paul, les suppositions ci-dessus ne sont pas correctes.


9
2018-05-23 04:20



Ceci est un bug de Lombok. Voir https://github.com/rzwitserloot/lombok/issues/1249 pour le rapport de bug officiel.


3
2018-05-08 14:02