Атрибуты аннотации с параметрами типа

Когда вы определяете интерфейс Java, можно объявить метод с параметрами типа, например, следующим образом:

public interface ExampleInterface {
    <E extends Enum<E>> Class<E> options();
}

То же самое не работает в аннотации. Это, например, незаконно:

public @interface ExampleAnnotation {
    <E extends Enum<E>> Class<E> options();
}

Я могу получить то, что мне нужно, используя необработанный тип Enum :

public @interface ExampleAnnotation {
    @SuppressWarnings("rawtypes")
    Class<? extends Enum> options();
}

Какова именно причина, по которой невозможно объявить атрибуты аннотации с помощью параметры типа?

26
задан Jesper 29 September 2011 в 08:37
поделиться

2 ответа

Третье издание Спецификации языка Java ™ гласит:

Следующие ограничения налагаются на объявления типов аннотаций в силу их синтаксиса без контекста :

  • Объявления типов аннотаций не могут быть общими.
  • Расширение не допускается. (Типы аннотаций неявно расширяют аннотации. Аннотация.)
  • Методы не могут иметь никаких параметров
  • Методы не могут иметь какие-либо параметры типа
  • Объявления методов не могут иметь бросает пункт
11
ответ дан 28 November 2019 в 07:22
поделиться

Они хотели ввести аннотации, чтобы люди могли использовать их только как аннотации. И не позволяйте разработчикам вкладывать в них логику. то есть начать программирование с использованием аннотаций , что, на мой взгляд, может сделать Java похожим на совершенно другой язык. Отсюда контекстно-свободная синтаксическая заметка в спецификации языка Java.

Следующие ограничения налагаются на объявления типов аннотаций в силу их контекстно-свободного синтаксиса :

Annotation type declarations cannot be generic.
No extends clause is permitted. (Annotation types implicitly extend annotation.Annotation.)
Methods cannot have any parameters
Methods cannot have any type parameters

(http: //java.sun. com / docs / books / jls / third_edition / html / interfaces.html)

Чтобы лучше понять, что я имею в виду, посмотрите, что делает этот хакер JVM: http: //www.cs.rice. edu / ~ mgricken / research / xajavac /

Он создает And, или аннотации в качестве инструкций и обрабатывает другие аннотации, используя их. Бесценный!

4
ответ дан 28 November 2019 в 07:22
поделиться
Другие вопросы по тегам:

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