Annotationsvererbung in Java-Schnittstellen
Warum erben Java-Klassen keine Annotationen von implementierten Schnittstellen? Dieses Verhalten wird in der Dokumentation zur @Inherited-Annotation speziell beschrieben:
Note also that this meta-annotation only causes annotations to be inherited from superclasses; annotations on implemented interfaces have no effect.
Diese Wahl ist bewusst, da sie eine subtile Art von Mehrfachvererbungskonflikt verhindert. Betrachten Sie das folgende Beispiel:
<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>
Wenn Annotationen von Schnittstellen geerbt würden, würde der Aufruf von MyClass.class.getMethod("doStuff").getAnnotation(Baz.class).value() zu einer Mehrdeutigkeit führen:
Um diesen Konflikt zu vermeiden, erbt Java ausdrücklich keine Annotationen von Schnittstellen. Dadurch wird sichergestellt, dass die Vererbungshierarchie für Annotationen klar und konsistent ist.
In Fällen, in denen Schnittstellenannotationen gewünscht sind, wird empfohlen, die implementierenden Klassenmethoden explizit zu annotieren. Dies bietet die Flexibilität, die spezifischen Anmerkungen zu steuern, die auf jede Methode angewendet werden.
Das obige ist der detaillierte Inhalt vonWarum erben Java-Klassen keine Anmerkungen von implementierten Schnittstellen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!