Javac не удается скомпилировать аннотации по статическим вложенным классам, которые имеют общедоступный список перечислений - программирование
Подтвердить что ты не робот

Javac не удается скомпилировать аннотации по статическим вложенным классам, которые имеют общедоступный список перечислений

Я столкнулся с следующим сбоем компиляции javac, где javac не распознал аннотации в статическом вложенном классе, у которого было общедоступное перечисление. Как только я переместил перечисление из статического вложенного класса, ошибки компиляции были решены. Кто-нибудь знает, почему Javac не удалось? Является ли это ошибкой компилятора java? Или есть java-нюанс, о котором я не знаю?

Ниже представлен отдельный тестовый пример.

Не удалось скомпилировать:

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
    }
  }
}

Вывод компиляции:

$ 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

компилирует:

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
  }
}

Скомпилирует без ошибок:

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

Что нужно отметить:

1) Обратите внимание на номер строки сбоя компиляции. Нет никакой проблемы при анализе аннотации NestedClassNoEnum.

2) Версия 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)
4b9b3361

Ответ 1

Если вы удалите импорт статического класса, код компилируется отлично, см. ниже код [Примечание: я не использовал аннотацию @Embed, поскольку у меня не было jar для нее, но это не имеет никакого значения]:

//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
        }
    }
}

Причина, по-видимому, связана с загрузкой классов и статическими классами. Ожидается, что загружаются enums, когда статические классы загружаются лениво. Поэтому java может пытаться остановиться во время компиляции, но это предположение.

EDIT: Согласно обсуждению с Паулом, предположение не правильное.