Почему интерфейсы не разрешены в качестве членов аннотации? - PullRequest
10 голосов
/ 23 августа 2011

Рассмотрим этот код:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Bar {
    Foo foo() default FooImpl.FooConstant;
}

Ошибка компилятора:

значение аннотации недопустимого типа

Если я заменим Foo на FooImpl, код будет принят.

В чем причина такого поведения?

Ответы [ 2 ]

7 голосов
/ 23 августа 2011

Если я заменим Foo на FooImpl, код будет принят.

Я был бы очень удивлен, если бы он был скомпилирован, если FooImpl не является перечислением.

Члены аннотации могутсодержит только следующее:

  • тип примитива
  • String
  • Литерал класса
  • аннотация
  • перечисление
  • или одномерные массивы любого из вышеперечисленных

Ошибка времени компиляции, если тип возвращаемого значения метода, объявленного в типе аннотации, является любым типом, отличным от одного изследующее: один из примитивных типов, String, Class и любой вызов Class, тип enum (§8.9), тип аннотации или массив (§10) одного из предыдущих типов.Это также ошибка времени компиляции, если какой-либо метод, объявленный в типе аннотации, имеет сигнатуру, эквивалентную переопределению, сигнатуре любого открытого или защищенного метода, объявленного в классе Object или в аннотации интерфейса. Аннотация.

Источник: JLS

3 голосов
/ 23 августа 2011

http://java.sun.com/docs/books/jls/third_edition/html/interfaces.html#9.7

Типы элементов аннотации должны быть одного из следующих типов: примитив, строка, класс, перечисление, массив любого из вышеперечисленных

Это ошибка времени компиляцииесли тип элемента не соизмерим с ElementValue.

Надеюсь, это поможет!

Обнаружено то же самое в этой документации:

http://download.oracle.com/javase/1.5.0/docs/guide/language/annotations.html

"Типы возврата ограничены примитивами, String,Класс, перечисления, аннотации и массивы предыдущих типов. "Как уже упоминалось, «интерфейс» не допускается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...