Which types can be used for Java annotation members?

annotations, java

Solution

It's specified by section 9.6.1 of the JLS. The annotation member types must be one of:

- primitive

- String

- an Enum

- another Annotation

- java.lang.Class

- an array of any of the above

It does seem restrictive, but no doubt there are reasons for it.

Also note that multidimensional arrays (e.g. `String[][]`) are implicitly forbidden by the above rule.

Problem

Today I wanted to create my first annotation interface following this documentation and I got this compiler error ``` Invalid type for annotation member": public @interface MyAnnotation { Object myParameter; ^^^^^^ } ``` Obviously `Object` cannot be used as type of an annotation member. Unfortunately I could not find any information on which types can be used in general. This I found out using trial-and-error: - `String` → Valid - `int` → Valid - `Integer` → Invalid (Surprisingly) - `String[]` → Valid (Surprisingly) - `Object` → Invalid Perhaps someone can shed some light on which types are actually allowed and why.

Original source