无法访问枚举类型的Enum <! - ? - > .valueOf(String)方法(或如何获取泛型参数的.class)?

时间:2012-02-29 01:41:18

标签: java generics

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

考虑以下示例

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包装器。

2 个答案:

答案 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())。你不必将课程与枚举联系在一起。