Annotationsvererbung in Java-Schnittstellen
Annotationsvererbung, angegeben durch die @Inherited-Annotation, ermöglicht die Weitergabe von Annotationen von Superklassen an Unterklassen. Eine bemerkenswerte Ausnahme von dieser Regel besteht jedoch darin, dass Annotationen auf implementierten Schnittstellen nicht von implementierenden Klassen geerbt werden.
Gemäß der Dokumentation für @Inherited „führt diese Metaannotation nur dazu, dass Annotationen von Superklassen geerbt werden; Annotationen.“ auf implementierte Schnittstellen haben keine Auswirkung . Betrachten Sie das folgende Beispiel:
Wenn Annotationen von Schnittstellen geerbt würden, welcher @Baz-Wert würde mit der MyClass.doStuff()-Methode verknüpft sein? „baz“, „phleem“ oder etwas anderes?
Praktische Implikationen
<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 MyClass implements Foo, Bar{}</code>
Annotationsvererbung auf Schnittstellen wird aufgrund der Möglichkeit von Konflikten allgemein als ungewöhnlich und unpraktisch angesehen Schwierigkeiten bei der Bestimmung der richtigen Annotation, wenn mehrere Schnittstellen widersprüchliche Annotationen angeben. Es ist ratsam, sich auf Annotationen zu Superklassen zu verlassen oder alternative Mechanismen zum Abfangen von Methoden in Dependency-Injection-Frameworks zu verwenden.
Das obige ist der detaillierte Inhalt vonWarum erben Java-Schnittstellen keine Anmerkungen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!