Heim  >  Artikel  >  Java  >  Warum erben Java-Klassen keine Anmerkungen von implementierten Schnittstellen?

Warum erben Java-Klassen keine Anmerkungen von implementierten Schnittstellen?

Linda Hamilton
Linda HamiltonOriginal
2024-11-04 18:18:02513Durchsuche

Why Don't Java Classes Inherit Annotations from Implemented Interfaces?

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:

  • Sollte die @Baz-Annotation von Foo geerbt werden?
  • Oder sollte die @Baz-Annotation von Bar geerbt werden?
  • Oder sollte die @Baz-Annotation von Flipp Superklasse vererbt werden?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn