Аннотации: ограничить ссылку на классы с аннотацией

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

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

 Class<? extends ServiceProviderIF> serviceIFProvider();

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

 Class<? contains AnnotationXYZ> classReferences();

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

TIA и с наилучшими пожеланиями, Оли


person nauni77    schedule 13.06.2012    source источник


Ответы (2)


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

person Michael Spector    schedule 13.06.2012
comment
Спасибо за подсказку, но это усложняет процесс и, ИМХО, не добавляет пользы. Причина в том, чтобы гарантировать, что все элементы внутри этого списка аннотаций будут иметь определенную аннотацию X (эта аннотация X содержит некоторую дополнительную информацию). Поэтому, если класс расширяет специальный интерфейс, нет смысла добавлять только классы с этой аннотацией. Или я ошибаюсь? С уважением, Оли - person nauni77; 14.06.2012
comment
Тип возвращаемого значения метода указывает некий вид контракта между вызывающим и вызываемым. Насколько я знаю, аннотации не предназначены для использования в контрактах. - person Michael Spector; 14.06.2012

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

person JB Nizet    schedule 13.06.2012
comment
Здравствуйте, спасибо за ваш ответ. Синтаксис - это всего лишь псевдокод. Другой синтаксис также приветствуется для решения... например: Class‹?› classReferences() with AnnotationXYZ; - person nauni77; 13.06.2012
comment
Нет никаких обозначений, которые могли бы позволить вам сделать это. Только проверки во время выполнения. - person JB Nizet; 13.06.2012
comment
Спасибо JB Nizet, я так и делаю в данный момент. Но информация об аннотации должна присутствовать в JVM (@Retention(RetentionPolicy.RUNTIME)). Это не очень хорошо, но если нет другого способа сделать это, лучше всего попрактиковаться. Спасибо и привет, Оли - person nauni77; 14.06.2012