Java注释成员可以使用哪些类型?

今天我想在这个文档之后创建我的第一个注释接口,我得到了这个编译器错误

Invalid type for annotation member":
public @interface MyAnnotation {
Object myParameter;
^^^^^^
}

显然,Object不能用作注释成员的类型。不幸的是,我找不到任何关于一般可以使用哪种类型的信息。

这是我通过反复试验得出的结论:

  • String→有效
  • int→有效
  • Integer→无效(令人惊讶)
  • String[]→有效(令人惊讶)
  • Object→无效

也许有人可以解释一下哪些类型是被允许的以及为什么。

117600 次浏览

它由第9.6.1条指定。注释成员类型必须是以下类型之一:

  • 原始的
  • 字符串
  • Enum
  • 另一个注释
  • 上述任意一个的数组

这看起来确实有限制,但毫无疑问,这是有原因的。

还要注意以上规则隐式禁止多维数组(例如String[][])。

不允许使用Class数组,如这个答案中所述。

注释的概念非常适合我的项目设计,直到我意识到注释中不能有复杂的数据类型。我通过使用我想要实例化的类而不是该类的实例化对象来解决这个问题。它不是完美的,但java很少是完美的。

@interface Decorated { Class<? extends PropertyDecorator> decorator() }


interface PropertyDecorator { String decorate(String value) }


class TitleCaseDecorator implements PropertyDecorator {
String decorate(String value)
}


class Person {
@Decorated(decorator = TitleCaseDecorator.class)
String name
}

也不要忘记注释本身可以是注释定义的一部分.;这允许一些简单的注释嵌套——在您希望一个注释多次出现的情况下非常方便。

例如:

@ComplexAnnotation({
@SimpleAnnotation(a="...", b=3),
@SimpleAnnotation(a="...", b=3),
@SimpleAnnotation(a="...", b=3)
})
public Object foo() {...}

SimpleAnnotation在哪里

@Target(ElementType.METHOD)
public @interface SimpleAnnotation {
public String a();
public int b();
)

ComplexAnnotation

@Target(ElementType.METHOD)
public @interface ComplexAnnotation {
public SimpleAnnotation[] value() default {};
)

示例取自: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)

根据Oracle,注释元素的有效类型是:

1. Primitives (byte, char, int, long float, double)
2. Enums
3. Class (Think generics here Class <?>, Class<? extends/super T>>)
4. String
5. Array of the above (array[] of primitives, enums, String, or Class)
5. Another annotation.

值得注意的是,所有元素本质上都是公开和抽象的。

因此

 static final variable(s) allowed as well.