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

2022-08-31 05:21:23

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

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

显然不能用作注释成员的类型。不幸的是,我找不到有关哪些类型通常可以使用的任何信息。Object

这是我使用试错法发现的:

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

也许有人可以阐明实际上允许哪些类型的类型以及为什么。


答案 1

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

  • 原始
  • 字符串
  • 枚举
  • 另一个注释
  • 上述任何一项的数组

这似乎确实具有限制性,但毫无疑问,这是有原因的。

另请注意,上述规则隐含禁止多维数组(例如 )。String[][]

不允许使用类的数组,如本答案中所述。


答案 2

我同意Skaffman对可用类型的看法。

附加限制 :它必须是编译时常量

例如,禁止以下行为:

@MyAnnot("a" + myConstantStringMethod())
@MyAnnot(1 + myConstantIntMethod())

推荐