Когда вы определяете интерфейс 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();
}
Какова именно причина, по которой невозможно объявить атрибуты аннотации с помощью параметры типа?
Третье издание Спецификации языка Java ™ гласит:
Следующие ограничения налагаются на объявления типов аннотаций в силу их синтаксиса без контекста :
Они хотели ввести аннотации, чтобы люди могли использовать их только как аннотации. И не позволяйте разработчикам вкладывать в них логику. то есть начать программирование с использованием аннотаций , что, на мой взгляд, может сделать 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, или аннотации в качестве инструкций и обрабатывает другие аннотации, используя их. Бесценный!