Héritage des annotations dans les interfaces Java
Pourquoi les classes Java n'héritent-elles pas des annotations des interfaces implémentées ? Ce comportement est spécifiquement décrit dans la documentation de l'annotation @Inherited :
Note also that this meta-annotation only causes annotations to be inherited from superclasses; annotations on implemented interfaces have no effect.
Ce choix est délibéré, car il évite un type subtil de conflit d'héritage multiple. Prenons l'exemple suivant :
<code class="java">@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @Inherited public @interface Baz { String value(); } public interface Foo { @Baz("baz") void doStuff(); } public interface Bar { @Baz("phleem") void doStuff(); } public class Flipp { @Baz("flopp") public void doStuff() {} } public class MyClass extends Flipp implements Foo, Bar {}</code>
Si les annotations des interfaces étaient héritées, l'appel de MyClass.class.getMethod("doStuff").getAnnotation(Baz.class).value() entraînerait une ambiguïté :
Pour éviter ce conflit, Java n'hérite explicitement pas des annotations des interfaces. Cela garantit que la hiérarchie d'héritage des annotations est claire et cohérente.
Dans les cas où des annotations d'interface sont souhaitées, il est recommandé d'annoter explicitement les méthodes de classe d'implémentation. Cela offre la flexibilité de contrôler les annotations spécifiques appliquées à chaque méthode.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!