Анотации: ограничавайте препратката до класове с анотация

Мисля, че това е невъзможно, но може би греша. Затова ви питам дали е възможно. ;-)

Ако дефинирам анотация, която приема само препратки към класове, които разширяват някакъв интерфейс или клас, това е възможно:

 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
Благодаря за намека, но това прави процеса по-сложен и не добавя IMHO никаква полза. Причината е да се гарантира, че всички елементи в този списък с анотации ще имат конкретна анотация X (тази анотация X има допълнителна информация). Така че, ако класът разширява специален интерфейс, няма полза да добавяте само класове с тази анотация. Или греша? С най-добри пожелания, Оли - person nauni77; 14.06.2012
comment
Типът връщане на метода указва някакъв вид договор между повикващия и извиквания. AFAIK, анотациите не са предназначени за използване в договори. - 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