Java - 为什么不允许Enum <e>作为注释成员?

时间:2016-01-22 09:49:20

标签: java generics enums annotations

它说:

  

原始

     

字符串

     

     

一个Enum

     

另一个注释

     

上述任何一个数组

只有这些类型作为注释成员才合法,为什么通用枚举可以成为注释的成员?

例如:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface Param {

    Enum value();

}

这是不允许的。但是Enum是不变的吗?当您使用@Param(XXX)时,填写Enum@Param(XXX)就会被确定(这意味着这是不变的)。为什么只允许特定枚举成为会员?

我要做的是制作一个接收任何枚举的注释:

// for example
@Param(value = AEnum.ABC)
@Param(value = BEnum.TTT)
@Param(value = CEnum.OOO)

我希望以上所有内容都是合法的。

1 个答案:

答案 0 :(得分:0)

虽然每个enum类型都继承自java.lang.Enum,但类型Enum本身并非enum类型。同样,虽然每个注释类型都继承自java.lang.annotation.Annotation,但类型Annotation本身不是注释类型。

没有技术原因,在类文件中,每个实际值都包含对其类型的引用。因此,将注释属性声明为Object并动态发现实际值的类型是技术性的,但正式规范不允许这样做。

顺便说一句,枚举常量也不是编译时常量。因此,虽然您可以声明类似final String FOO = "some string";的编译时常量并在类似@Name(value=FOO)的注释中引用它,但您不能对enum常量执行相同的操作。您只能引用enum类型本身声明的常量,如EnumType.NAME。这也是它在规范中正式定义的结果。