Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否有方法为*any*枚举声明注释属性?_Java_Enums_Annotations - Fatal编程技术网

Java 是否有方法为*any*枚举声明注释属性?

Java 是否有方法为*any*枚举声明注释属性?,java,enums,annotations,Java,Enums,Annotations,目前,我正在为JavaSwing开发一个基于注释的绑定框架,该框架使用UndertheHood。不幸的是,我被JRadioButton绑定的注释所困扰。 我要做的是指定一个模型的属性名,该模型包含一个特殊值(enum)。如果该属性具有特定值,则应选择单选按钮。现在我想在注释中指定如下值: @RadioButtonBinding(property = "selectedItem", selectedValue = MyEnum.FIRST) JRadioButton firstButton @R

目前,我正在为JavaSwing开发一个基于注释的绑定框架,该框架使用UndertheHood。不幸的是,我被JRadioButton绑定的注释所困扰。 我要做的是指定一个模型的属性名,该模型包含一个特殊值(enum)。如果该属性具有特定值,则应选择单选按钮。现在我想在注释中指定如下值:

@RadioButtonBinding(property = "selectedItem", selectedValue = MyEnum.FIRST)
JRadioButton firstButton

@RadioButtonBinding(property = "selectedItem", selectedValue = MyEnum.SECOND)
JRadioButton secondButton
但是,我不知道如何声明注释以允许上述和任何其他枚举。我的第一个猜测是这样的,但我了解到注释属性不能是泛型的:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface RadioButtonBinding {

    /** The model-property to which the selected value is bound */
    String property();

    // Idea 1: Specifying the enum class and the enum constant as String - works but is not typesafe

    Class<? extends Enum<?>> enumClass();

    String enumConstantName();

    // Idea 2: Directly specifying the enum constant - gives a compile-time error

    <T extends Enum<T>> T enumValue();

}
@已记录
@保留(RetentionPolicy.RUNTIME)
@目标(ElementType.FIELD)
公共@interface RadioButton绑定{
/**选定值绑定到的模型特性*/
字符串属性();
//想法1:将enum类和enum常量指定为String-works,但不是类型安全的
类>枚举类();
字符串enumConstantName();
//想法2:直接指定枚举常量-产生编译时错误
T枚举值();
}

有什么办法解决这个问题吗?

它不会按你想要的方式工作。正如您所发现的,您只能在注释中使用真正简单的返回类型。此外,试图通过滥用字符串之类的操作来绕过这些限制是行不通的,因为需要使用常量表达式来初始化注释的值


我认为最接近的方法是使用字符串初始化,然后使用代码与枚举的名称()进行比较。但是你的类型安全性就不一样了…

如果你的枚举可以实现所有相同的接口,你可能会发现这个问题很有用“

我正试图解决这个完全相同的问题,据我所知,这是不可能做到的。 这真是个糟糕透顶的事


在我的例子中,我想指定@Version注释,在这里可以使用任何枚举,枚举值可以按序号进行比较(以找到版本的顺序)。看起来我需要做一些其他框架(比如我认为的Guice)所做的事情,并使用double;虽然有点难看,但对>=来说还可以,这里列出的RadioButtonBinding注释包括两个想法:第一个是指定枚举类和要从中使用的字符串常量。但这当然不是类型安全的,可能会导致运行时异常。第二种方法是直接指定枚举的值,但这似乎不起作用。顺便说一句,我用JGoodies做了很多类似的事情,这是我在Java中经历的最痛苦的一次。最大的问题是,他有一个“基类”,他的大多数其他类都扩展了这个“基类”,因此他的方法有一个类似于签名的方法(base、base、base),其中传入的“基类”必须是一个特定的实例,但签名没有提示它必须是哪个特定类的实例。绑定部分是一个好主意,但他当时(几年前)并不支持它,而且它还没有完成,只有德语文档记录。您将如何在注释属性中使用该公共接口<代码>枚举值()的工作效果并不比没有界面好。