Search code examples
javaannotations

Which types can be used for Java annotation members?


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.


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.