Java Can';t访问枚举<>;。泛型类型的valueOf(String)方法(或如何获取泛型参数的.class)?

Java Can';t访问枚举<>;。泛型类型的valueOf(String)方法(或如何获取泛型参数的.class)?,java,generics,Java,Generics,如果给定的枚举是泛型类的参数,我如何访问枚举的静态方法 考虑下面的例子 public class EnumListBox<T extends Enum<T>> extends ListBox implements LeafValueEditor<T> { @Override public void setValue(T value) { // something.. } @Override pu

如果给定的枚举是泛型类的参数,我如何访问枚举的静态方法

考虑下面的例子

public class EnumListBox<T extends Enum<T>> extends ListBox implements LeafValueEditor<T>
{
    @Override
    public void setValue(T value)
    {
        // something..
    }

    @Override
    public T getValue()
    {
        int ndx = getSelectedIndex();
        String val = getValue(ndx);
        return T.valueOf(val);
    }
}
公共类EnumListBox扩展ListBox实现了LeafValueEditor
{
@凌驾
公共无效设置值(T值)
{
//某物。。
}
@凌驾
公共T getValue()
{
int ndx=getSelectedIndex();
字符串val=getValue(ndx);
返回T.valueOf(val);
}
}

由于某些原因,
Enum.valueOf(String)
对我不可用。此方法的另一个版本有两个参数,需要
Class最简单的修复方法是在
EnumListBox
的构造函数中传递枚举类的实例

public class EnumListBox<T extends Enum<?>> extends ListBox implements LeafValueEditor<T>
{
    private final Class<T> mClazz;

    public EnumListBox(Class<T> clazz) {
        mClazz = clazz;
    }

    @Override
    public T getValue()
    {
        int ndx = getSelectedIndex();
        String val = getValue(ndx);
        return Enum.valueOf(mClazz, val);
    }
}

公共类EnumListBox使用反射往往是个坏主意。不幸的是,Java中没有非反射元枚举类型。在这种情况下,我们只需要实际值的列表

public class EnumListBox<T extends Enum<T>> extends ListBox implements LeafValueEditor<T> {
    private final List<T> values;

    public EnumListBox(T[] values) {
        return Collections.unmodifiableList(Arrays.asList(values.clone()));
    }

    @Override public void setValue(T value) {
        // something..
    }

    @Override public T getValue() {
        int index = getSelectedIndex();
        return values.get(index);
    }
}
公共类EnumListBox扩展ListBox实现了LeafValueEditor{
私有最终列表值;
公共枚举列表框(T[]个值){
返回Collections.unmodifiableList(Arrays.asList(values.clone());
}
@覆盖公共无效设置值(T值){
//某物。。
}
@重写公共T getValue(){
int index=getSelectedIndex();
返回值.get(索引);
}
}

构造为新EnumListBox(MyEnum.values())
。您实际上不必将类与枚举绑定。

@ruslan此解决方案有什么问题?@ruslan-您认为它不是通用的是什么意思?这与使用的技巧基本相同。@natix我认为他希望使用没有任何参数化构造函数的包装器类。@CENGISCAN-他可能希望这样,但由于类型擦除,这不会发生。有一件事我不确定:如果T(枚举)定义了一个名为valueOf(class,name)的静态方法怎么办,Enum.valueOf(,)和T.valueOf(,)之间是否有任何差异?谢谢,说得好。我被迫使用ListBox,因为我需要本地化它的值,因此它们必须在uiBinder模板中定义。也许有更好的办法,但我还不知道。稍后我将发布关于它的具体问题。