Какие типы могут использоваться для участников аннотации Java?

Сегодня я хотел создать свой первый интерфейс аннотации после этой документации, и я получил эту ошибку компилятора

Invalid type for annotation member":
public @interface MyAnnotation {
    Object myParameter;
    ^^^^^^
}

Очевидно, Object не может использоваться в качестве типа участника аннотации. К сожалению, я не мог найти информацию, на которой типы могут использоваться в целом.

Это я узнал эмпирическое использование:

  • String → Допустимый
  • int → Допустимый
  • Integer → Недопустимый (Удивительно)
  • String[] → Допустимый (Удивительно)
  • Object → Недопустимый

Возможно, кто-то может пролить некоторый свет, на котором типы на самом деле позволяются и почему.

219
задан Daniel Rikowski 3 July 2019 в 19:34
поделиться

2 ответа

Это указано в разделе 9.6.1 JLS . Типы членов аннотации должны быть одним из:

  • примитив
  • Строка
  • Перечисление
  • другое Аннотации
  • массив любого из вышеперечисленных
  • Класса

Это кажется ограничивающим, но без сомнения, для этого есть причины.

Также обратите внимание, что многомерные массивы (например, String [] [] ) неявно запрещены указанным выше правилом.

Массивы класса не разрешены, как описано в этот ответ .

299
ответ дан 23 November 2019 в 04:10
поделиться

Я согласен со Скаффманом относительно доступных типов.

Дополнительное ограничение: это должна быть константа времени компиляции .

Например, следующие запрещены:

@MyAnnot("a" + myConstantStringMethod())
@MyAnnot(1 + myConstantIntMethod())
58
ответ дан 23 November 2019 в 04:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: