如果给定的枚举是泛型类的参数,我如何访问枚举的静态方法?
考虑以下示例
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);
}
}
由于某些原因,我无法使用Enum<?>.valueOf(String)
。此方法的另一个版本有两个参数,并且需要Class<Enum<?>>
,我无法将其实例化为T.class
。
你会如何解决这个问题?基本上我想为任何枚举使用通用的ListBox包装器。
答案 0 :(得分:8)
最简单的解决方法是在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);
}
}
答案 1 :(得分:0)
使用反射往往是个坏主意。不幸的是,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);
}
}
构造为new EnumListBox<>(MyEnum.values())
。你不必将课程与枚举联系在一起。