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模板中定义。也许有更好的办法,但我还不知道。稍后我将发布关于它的具体问题。