Heute wollte ich nach dieser Dokumentation meine erste Anmerkungsschnittstelle erstellen und habe diesen Compilerfehler erhalten
Invalid type for annotation member": public @interface MyAnnotation { Object myParameter; ^^^^^^ }
Object
Kann offensichtlich nicht als Typ eines Anmerkungselements verwendet werden. Leider konnte ich keine Informationen darüber finden, welche Typen generell verwendet werden können.
Dies habe ich mithilfe von Versuch und Irrtum herausgefunden:
String
→ Gültigint
→ GültigInteger
→ ungültig (überraschend)String[]
→ Gültig (überraschend)Object
→ Ungültig
Vielleicht kann jemand etwas Licht ins Dunkel bringen, welche Typen tatsächlich erlaubt sind und warum.
java
annotations
Daniel Rikowski
quelle
quelle
Antworten:
Es ist in Abschnitt 9.6.1 des JLS angegeben . Die Anmerkungselementtypen müssen einer der folgenden sein:
Es scheint restriktiv zu sein, aber es gibt zweifellos Gründe dafür.
Beachten Sie auch, dass mehrdimensionale Arrays (z. B.
String[][]
) durch die obige Regel implizit verboten sind.Arrays of Class sind nicht zulässig, wie in dieser Antwort beschrieben .
quelle
Ich stimme Skaffman für die verfügbaren Typen zu.
Zusätzliche Einschränkung: Es muss eine Konstante für die Kompilierungszeit sein .
Zum Beispiel sind folgende verboten:
quelle
Vergessen Sie auch nicht, dass Anmerkungen selbst Teil einer Anmerkungsdefinition sein können . Dies ermöglicht eine einfache Verschachtelung von Anmerkungen - praktisch in Fällen, in denen eine Anmerkung mehrmals vorhanden sein soll.
Beispielsweise:
wo
SimpleAnnotation
istund
ComplexAnnotation
istBeispiele aus: http://web.archive.org/web/20131216093805/https://blogs.oracle.com/toddfast/entry/creating_nested_complex_java_annotations
(ursprüngliche URL: https://blogs.oracle.com/toddfast/entry/creating_nested_complex_java_annotations )
quelle
@Repeatable
wird dies nicht mehr benötigt.Das Konzept der Anmerkungen passt sehr gut zum Design meines Projekts, bis mir klar wurde, dass die Anmerkung keine komplexen Datentypen enthalten kann. Ich habe es umgangen, indem ich die Klasse von dem verwendet habe, was ich instanziieren wollte, anstatt ein instanziiertes Objekt dieser Klasse. Es ist nicht perfekt, aber Java ist es selten.
quelle