我无法使用从常量中获取的枚举作为注释中的参数。我收到此编译错误:“注释属性[attribute]的值必须是一个枚举常量表达式”。
这是枚举代码的简化版本:
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() {
}
}
该错误仅在方法B的“ theEnum = MYENUM_CONSTANT”中显示。字符串和int常量在编译器中是可以的,但Enum常量不是,即使它的值与methodA上的值完全相同。在我看来,这是编译器中缺少的功能,因为这三个显然都是常量。没有方法调用,没有奇怪的类使用等。
我想要实现的是:
- 要在注释中和代码后面均使用MYENUM_CONSTANT。
- 为了保持键入安全。
任何实现这些目标的方法都可以。
编辑:
谢谢大家 正如您所说,这是不可能完成的。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。