Warum java-Klassen nicht Erben Anmerkungen von implementierten interfaces?
Habe ich mit Guice ist AOP abzufangen einige Methodenaufrufe. Meine Klasse implementiert ein interface und ich würde gerne kommentieren die Methoden der Schnittstelle so Guice könnte die Auswahl der richtigen Methoden. Auch wenn der annotation-Typ versehen mit Geerbt annotation implementierende Klasse nicht Erben die annotation wie es in Geerbten java-doc:
Beachten Sie auch, dass diese meta-annotation
führt nur dazu, dass Annotationen zu werden
geerbt von Oberklassen;
Anmerkungen auf der implementierten Schnittstellen
keine Wirkung haben.
Was könnte der Grund dafür sein? Kennenlernen alle Schnittstellen, die ein Objekt der Klasse nicht implementieren, in der runtime ist nicht so, dass harte Sache zu tun, also muss es ein guter Grund hinter dieser Entscheidung.
InformationsquelleAutor Boris Pavlović | 2011-01-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde sagen, der Grund ist, dass andernfalls eine mehrfach-Vererbung problem auftreten würde.
Beispiel:
Wenn ich dies tun:
was ist das Ergebnis? 'baz', 'phleem' oder 'flopp'?
Aus diesem Grund Annotationen Schnittstellen sind selten nützlich.
Ich weiß nicht, Leute. In diesem Fall (wenn die typo noch nicht da war), würde ich erwarten, dass ein
The field value is ambiguous.
-wie compiler-Fehler, genau wie mit zwei Schnittstellen deklarieren der gleichen Konstanten mit verschiedenen Werten. Ich weiß, dass dies ist nicht ein Feld, aber annotation-Werte Holen Sie sich alle aufgelöst werden zur compile-Zeit, nicht wahr? Das feature fehlt uns hier wäre super-hilfreich in vielen Fällen. Sorry für die Wiederbelebung einer alten post übrigens :).haben Sie einen Blick auf die Art der Quellen, um zu sehen, wie der Frühling Jungs gearbeitet, um diese Probleme. Siehe AnnotationUtils.findAnnotation(Methode, annotationType)
Ich überlegte, etwas zu schreiben ähnlich wie diese. Mit irgendeiner Art von einfachen caching, dies scheint ein Weg zu gehen für mich. Danke! Im obigen Beispiel würde der
Foo
's annotation (MyClass
hat Sie nicht, dann sind Schnittstellen gesucht und genommen in der Reihenfolge, in der Sie nachimplements
) und daher" drucken "baz". Cool.stimmt, es dauerte nur 2 Jahre für jemanden zu erkennen, die Tippfehler 🙂
InformationsquelleAutor Sean Patrick Floyd
Aus der Javadoc für @Inherited:
Auf der anderen Seite, JSR 305 Prüfungen eine Art von erbschaft-lookup. Wenn Sie eine Hierarchie von Klassen:
Dann die effektive überprüfungen auf
Student.getAge()
sind@Nonnull @Min(5)
.@Nonnull
hat keine@Inherited
meta-annotation.dein Beispiel widerspricht Ihre Antwort, die sagt, dass
@Inherited
hat keine Auswirkungen auf alles andere als Klassenur arbeiten, wenn Sie die annotation an der Klasse
InformationsquelleAutor Eric Jablow