Hoje eu queria criar minha primeira interface de anotação seguindo esta documentação e recebi esse erro do compilador
Invalid type for annotation member": public @interface MyAnnotation { Object myParameter; ^^^^^^ }
Obviamente, Object
não pode ser usado como tipo de membro de anotação. Infelizmente, não consegui encontrar nenhuma informação sobre quais tipos podem ser usados em geral.
Descobri isso usando tentativa e erro:
String
→ Válidoint
→ VálidoInteger
→ Inválido (Surpreendentemente)String[]
→ Válido (Surpreendentemente)Object
→ Inválido
Talvez alguém possa esclarecer quais tipos são realmente permitidos e por quê.
java
annotations
Daniel Rikowski
fonte
fonte
Respostas:
É especificado na seção 9.6.1 do JLS . Os tipos de membros da anotação devem ser um dos seguintes:
Parece restritivo, mas sem dúvida há razões para isso.
Observe também que matrizes multidimensionais (por exemplo
String[][]
) são implicitamente proibidas pela regra acima.Matrizes de classe não são permitidas, conforme descrito nesta resposta .
fonte
Eu concordo com Skaffman para os tipos disponíveis.
Restrição adicional: deve ser uma constante em tempo de compilação .
Por exemplo, é proibido o seguinte:
fonte
Além disso, não esqueça que as próprias anotações podem fazer parte de uma definição de anotação . Isso permite aninhamento simples de anotações - útil nos casos em que você gostaria que uma anotação estivesse presente várias vezes.
Por exemplo:
onde
SimpleAnnotation
estae
ComplexAnnotation
éExemplos retirados de: http://web.archive.org/web/20131216093805/https://blogs.oracle.com/toddfast/entry/creating_nested_complex_java_annotations
(URL original: https://blogs.oracle.com/toddfast/entry/creating_nested_complex_java_annotations )
fonte
@Repeatable
, isso não é mais necessário.O conceito de anotações se encaixa muito bem com o design do meu projeto, até que eu percebi que você não pode ter tipos de dados complexos na anotação. Eu consegui contornar isso usando a classe do que eu queria instanciar, em vez de um objeto instanciado dessa classe. Não é perfeito, mas java raramente é.
fonte