Сегодня я хотел создать свой первый интерфейс аннотации после этой документации, и я получил эту ошибку компилятора
Invalid type for annotation member": public @interface MyAnnotation { Object myParameter; ^^^^^^ }
Очевидно, что Object
нельзя использовать как тип элемента аннотации. К сожалению, я не смог найти никакой информации о том, какие типы могут быть использованы в целом.
Об этом я узнал методом проб и ошибок:
String
→ Действительныйint
→ ДействительныйInteger
→ Неверно (Удивительно)String[]
→ Действителен (Удивительно)Object
→ Неверно
Возможно, кто-то может пролить свет на то, какие типы действительно разрешены и почему.
java
annotations
Даниэль Риковски
источник
источник
Ответы:
Это указано в разделе 9.6.1 JLS . Типы элементов аннотации должны быть одного из:
Это кажется ограничительным, но, несомненно, есть причины для этого.
Также обратите внимание, что многомерные массивы (например
String[][]
) неявно запрещены вышеуказанным правилом.Массивы класса не допускаются, как описано в этом ответе .
источник
Я согласен со Скаффманом для доступных типов.
Дополнительное ограничение: это должна быть константа времени компиляции .
Например, запрещено следующее:
источник
Также не забывайте, что сами аннотации могут быть частью определения аннотации . Это позволяет несколько простых вложений аннотаций - удобно в тех случаях, когда вы хотите, чтобы одна аннотация присутствовала много раз.
Например:
где
SimpleAnnotation
находитсяи
ComplexAnnotation
этоПримеры взяты из: http://web.archive.org/web/20131216093805/https://blogs.oracle.com/toddfast/entry/creating_nested_complex_java_annotations
(оригинальный URL: https://blogs.oracle.com/toddfast/entry/creating_nested_complex_java_annotations )
источник
@Repeatable
это больше не нужно.Концепция аннотаций очень хорошо согласуется с дизайном моего проекта, пока я не понял, что в аннотации не может быть сложных типов данных. Я справился с этим, используя класс того, что я хотел создать, а не объект этого класса. Это не идеально, но редко бывает Java.
источник