我无法使用从常量获取的 Enum 作为注释中的参数。我得到了这个编译错误: “注释属性[属性]的值必须是枚举常量表达式”。
这是 Enum 代码的简化版本:
public enum MyEnum {
APPLE, ORANGE
}
注释:
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD })
public @interface MyAnnotation {
String theString();
int theInt();
MyEnum theEnum();
}
还有班级:
public class Sample {
public static final String STRING_CONSTANT = "hello";
public static final int INT_CONSTANT = 1;
public static final MyEnum MYENUM_CONSTANT = MyEnum.APPLE;
@MyAnnotation(theEnum = MyEnum.APPLE, theInt = 1, theString = "hello")
public void methodA() {
}
@MyAnnotation(theEnum = MYENUM_CONSTANT, theInt = INT_CONSTANT, theString = STRING_CONSTANT)
public void methodB() {
}
}
错误只显示在 methodB 上的“ theEnum = MYENUM _ CONSTANT”中。编译器可以使用 String 和 int 常量,但 Enum 常量不行,即使它的值与 methodA 上的值完全相同。在我看来,这似乎是编译器中缺少的一个特性,因为这三个特性显然都是常量。没有方法调用,没有对类的奇怪使用,等等。
我想实现的是:
任何实现这些目标的方法都是可行的。
编辑:
谢谢大家。就像你说的,这是不可能的。JLS 应该更新。这次我决定忘记注释中的枚举,而使用常规的 int 常量。只要 int 是从命名常量赋值的,值就是有界的,并且是“有点”安全的类型。
它看起来像这样:
public interface MyEnumSimulation {
public static final int APPLE = 0;
public static final int ORANGE = 1;
}
...
public static final int MYENUMSIMUL_CONSTANT = MyEnumSimulation.APPLE;
...
@MyAnnotation(theEnumSimulation = MYENUMSIMUL_CONSTANT, theInt = INT_CONSTANT, theString = STRING_CONSTANT)
public void methodB() {
...
我可以在代码中的任何其他地方使用 MYENUMSIMUL _ CONSTANT。