Aujourd'hui, je voulais créer ma première interface d'annotation en suivant cette documentation et j'ai eu cette erreur de compilation
Invalid type for annotation member": public @interface MyAnnotation { Object myParameter; ^^^^^^ }
De toute évidence, Object
ne peut pas être utilisé comme type de membre d'annotation. Malheureusement, je n'ai trouvé aucune information sur les types pouvant être utilisés en général.
J'ai découvert cela en utilisant des essais et erreurs:
String
→ Valideint
→ ValideInteger
→ Invalide (Étonnamment)String[]
→ Valide (Étonnamment)Object
→ invalide
Peut-être que quelqu'un peut faire la lumière sur les types autorisés et pourquoi.
java
annotations
Daniel Rikowski
la source
la source
Réponses:
Il est spécifié par la section 9.6.1 du JLS . Les types de membres d'annotation doivent être l'un des suivants:
Cela semble restrictif, mais il y a sans aucun doute des raisons à cela.
Notez également que les tableaux multidimensionnels (par exemple
String[][]
) sont implicitement interdits par la règle ci-dessus.Les tableaux de classe ne sont pas autorisés comme décrit dans cette réponse .
la source
Je suis d'accord avec Skaffman pour les types disponibles.
Restriction supplémentaire: il doit s'agir d'une constante de temps de compilation .
Par exemple, les éléments suivants sont interdits:
la source
N'oubliez pas non plus que les annotations elles-mêmes peuvent faire partie d'une définition d'annotation . Cela permet une imbrication d'annotation simple - pratique dans les cas où vous souhaitez avoir une annotation présente plusieurs fois.
Par exemple:
où
SimpleAnnotation
estet
ComplexAnnotation
estExemples tirés de: http://web.archive.org/web/20131216093805/https://blogs.oracle.com/toddfast/entry/creating_nested_complex_java_annotations
(URL d'origine: https://blogs.oracle.com/toddfast/entry/creating_nested_complex_java_annotations )
la source
@Repeatable
, cela n'est plus nécessaire.Le concept d'annotations correspond très bien à la conception de mon projet, jusqu'à ce que je réalise que vous ne pouvez pas avoir de types de données complexes dans l'annotation. Je l'ai contourné en utilisant la classe de ce que je voulais instancier plutôt qu'un objet instancié de cette classe. Ce n'est pas parfait, mais Java l'est rarement.
la source