Hoy quería crear mi primera interfaz de anotación siguiendo esta documentación y recibí este error de compilación
Invalid type for annotation member": public @interface MyAnnotation { Object myParameter; ^^^^^^ }
Obviamente Object
no se puede usar como tipo de miembro de anotación. Lamentablemente, no pude encontrar ninguna información sobre qué tipos se pueden utilizar en general.
Esto lo descubrí usando prueba y error:
String
→ Válidoint
→ VálidoInteger
→ Inválido (Sorprendentemente)String[]
→ Válido (Sorprendentemente)Object
→ Inválido
Quizás alguien pueda arrojar algo de luz sobre qué tipos están realmente permitidos y por qué.
java
annotations
Daniel Rikowski
fuente
fuente
Respuestas:
Se especifica en la sección 9.6.1 de JLS . Los tipos de miembros de anotación deben ser uno de:
Parece restrictivo, pero sin duda hay razones para ello.
También tenga en cuenta que las matrices multidimensionales (por ejemplo
String[][]
) están implícitamente prohibidas por la regla anterior.Las matrices de clase no están permitidas como se describe en esta respuesta .
fuente
Estoy de acuerdo con Skaffman para los tipos disponibles.
Restricción adicional: tiene que ser una constante de tiempo de compilación .
Por ejemplo, lo siguiente está prohibido:
fuente
Además, no olvide que las anotaciones en sí mismas pueden ser parte de una definición de anotación . Esto permite un anidamiento de anotaciones simple, útil en casos en los que le gustaría tener una anotación presente muchas veces.
Por ejemplo:
donde
SimpleAnnotation
estay
ComplexAnnotation
esEjemplos tomados 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 )
fuente
@Repeatable
, esto ya no es necesario.El concepto de anotaciones encaja muy bien con el diseño de mi proyecto, hasta que me di cuenta de que no puede tener tipos de datos complejos en la anotación. Lo evité usando la clase de lo que quería instanciar en lugar de un objeto instanciado de esa clase. No es perfecto, pero Java rara vez lo es.
fuente