它说:
原始
字符串
类
一个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)
我希望以上所有内容都是合法的。
答案 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
。这也是它在规范中正式定义的结果。