113 votes

Pourquoi les classes java n’héritent pas les annotations d’interfaces implémentées ?

J'ai été en utilisant Guice de l'AOP pour intercepter certains appels de méthode. Ma classe implémente une interface, et je tiens à annoter l'interface des méthodes de Guice pourrait choisir les bonnes méthodes. Même si le type d'annotation est annoté avec des Hérité d'annotation de la mise en œuvre de la classe n'hérite pas l'annotation comme indiqué dans Hérité de la java doc:

Notez également que cette méta-annotation seules causes des annotations hérité de super-classes; annotations sur la mise en œuvre des interfaces n'ont aucun effet.

Quelle pourrait être la raison pour cela? Apprendre à connaître toutes les interfaces d'un objet de la classe ne mettre en œuvre lors de l'exécution n'est pas chose difficile à faire, donc il doit y avoir une bonne raison derrière cette décision.

133voto

Sean Patrick Floyd Points 109428

Je dirais que la raison est que dans le cas contraire un problème d’héritage multiple se produirait.

Exemple :

Si je fais ceci :

ce qui va être le résultat ? « baz », « phleem » ou « flopp » ?


Pour cette raison, les annotations sur les interfaces sont rarement utiles.

36voto

Eric Jablow Points 71

À partir de la Javadoc pour @Hérité:

Indique qu'un type d'annotation est automatiquement héritée. Si un Hérité de la méta-annotation est présente sur un type d'annotation déclaration, et les requêtes de l'utilisateur le type d'annotation sur une classe déclaration et la déclaration de la classe n'a pas d'annotation pour cette le type, la classe de super-classe sera automatiquement interrogé pour le type d'annotation. Ce processus sera répété jusqu'à ce qu'une annotation pour ce type n'est trouvé, ou le haut de la hiérarchie de classe (Objet) est atteint. Si aucun super-classe a une annotation de ce type, alors la la requête indique que la classe en question n'a aucune annotation. Notez que cette méta-annotation de type a aucun effet si la annoté type est utilisé pour annoter rien d'autre qu'une classe. Notez également que cette méta-annotation seules causes des annotations hérité de super-classes; annotations sur la mise en œuvre des interfaces n'ont aucun effet.

D'autre part, la JSR 305 validateurs faire une sorte de succession de recherche. Si vous disposez d'une hiérarchie de classes:

//Person.java
@Nonnull
 public Integer getAge() {...}

//Student.java (inherits from Person)
@Min(5)
public Integer getAge() {...}

Puis l'effet des validations sur Student.getAge() sont @Nonnull @Min(5). @Nonnull n'a pas d' @Inherited méta-annotation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X