Annotations héritées : exclusion d'interface
Malgré le type d'annotation portant l'annotation Inherited, les classes Java n'héritent pas des annotations des interfaces implémentées. Ce comportement provient de conflits d'héritage potentiels.
Considérons l'exemple suivant :
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @Inherited public @interface Baz { String value(); } interface Foo { @Baz("baz") void doStuff(); } interface Bar { @Baz("phleem") void doStuff(); } class Flipp { @Baz("flopp") public void doStuff() {} } class MyClass extends Flipp implements Foo, Bar {}
Lors de l'accès aux annotations via la réflexion :
MyClass.class.getMethod("doStuff").getAnnotation(Baz.class).value();
Le résultat devient ambigu, car il il n'y a pas de chemin d'héritage clair pour l'annotation. Serait-ce « baz », « phleem » ou « flopp » ?
Pour éviter de tels conflits et maintenir la clarté, Java exclut intentionnellement les annotations héritées des interfaces. Les annotations placées sur les méthodes d'interface ont généralement une utilité limitée en raison de cette restriction d'héritage.
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!