2012-06-13 2 views
1

Я думаю, что это невозможно, но, возможно, я ошибаюсь. Поэтому я прошу вас, если это возможно. ;-)Аннотации: ограничить ссылки на классы с аннотацией

Если я определяю аннотацию, которые принимают только ссылки на класс, который распространяется некоторый интерфейс или класс, который можно:

Class<? extends ServiceProviderIF> serviceIFProvider(); 

В этой аннотации я могу только добавить класс, который расширяет ServiceProviderIF. Мой вопрос: возможно ли такое определение для другой аннотации? Это означает, что с псевдокода что-то вроде этого

Class<? contains AnnotationXYZ> classReferences(); 

AnnotationXYZ другое определение аннотаций. И класс, который должен быть добавлен, принимается только с помощью этой аннотации.

ТИА и наилучшие пожелания, Оли

ответ

1

Это невозможно. Аннотации могут быть заданы для любого типа (класса, интерфейса), но метод Java не может возвращать типы с несколькими типами из разных иерархий. Другими словами, вы должны поместить все ваши классы, которые содержат аннотацию AnnotationXYZ в той же иерархии под некоторым интерфейсом или классом Blabla, а затем используйте подстановочный знак типа <? extends Blabla>.

+0

Спасибо за подсказку, но это усложняет процесс и добавляет ИМХО никакой выгоды. Причина в том, что все элементы внутри этого аннотационного списка будут иметь конкретную аннотацию X (эта аннотация X содержит дополнительную информацию). Поэтому, если класс расширяет специальный интерфейс, нет никакой пользы для того, чтобы позаботиться о добавлении только классов с этой аннотацией. Или я ошибаюсь? С наилучшими пожеланиями, Oli – nauni77

+0

Тип возврата метода указывает какой-то контракт между вызывающим и вызываемым. AFAIK, аннотации не предназначены для использования в контрактах. – spektom

3

Нет, это не возможно. В типовых типах допускаются только типы. И аннотации не определяют типы.

+0

Здравствуйте, спасибо за ваш ответ. Синтаксис - это только псевдокод. Другой синтаксис также можно получить, чтобы получить решение ... например: Класс classReferences() с AnnotationXYZ; – nauni77

+0

Нет никаких обозначений, которые могут позволить вам это сделать. Только проверки времени выполнения. –

+0

Спасибо JB Nizet, вот как я это делаю в данный момент. Но информация об Аннотации должна присутствовать в JVM (@Retention (RetentionPolicy.RUNTIME)). Это не так хорошо, но если нет другого способа сделать это, это «лучшая практика». Спасибо и приветствую, Oli – nauni77

Смежные вопросы