如何创建通用枚举转换器?

时间:2015-01-26 09:18:40

标签: java generics enums

我想编写一个可以像new EnumConverter(MyEnum.class);

一样使用的泛型类

但是,我必须编写该类,以便它可以使用enum.values()的泛型调用吗?

public class EnumConverter {
    public EnumConverter(Class<Enum<?>> type) {
        this.type = type;
    }

    public EnumConverter convert(String text) {
        //error: Type mismatch: cannot convert from element type capture#1-of ? to Enum<?>
        for (Enum<?> candidate : type.getDeclaringClass().getEnumConstants()) {
            if (candidate.name().equalsIgnoreCase(text)) {
                return candidate;
            }
        }
    }
}

5 个答案:

答案 0 :(得分:3)

您返回的方法转换类型错误:应该是Enum而不是EnumConverter。然后,您不必致电getDeclaringClass(),而是使用您已有类型的Class

我建议采用更通用的方法:

public static class EnumConverter<T extends Enum<T>>
{

    Class<T> type;

    public EnumConverter(Class<T> type)
    {
        this.type = type;
    }

    public Enum<T> convert(String text)
    {
        for (Enum<T> candidate : type.getEnumConstants()) {
            if (candidate.name().equalsIgnoreCase(text)) {
                return candidate;
            }
        }

        return null;
    }
}

答案 1 :(得分:2)

您的问题不一致且无效的代码: 1)this.type未定义为字段 2)您将转换定义为返回EnumConverter但返回Enum

从文本返回枚举的枚举值,不需要通用的东西。你只需使用:

Enum.valueOf(MyEnum.class, "TWO")

答案 2 :(得分:0)

如果有人在寻找具有for for循环的替代解决方案。

   // classType is target Enum
     public static Enum<?> toEnum(final Class<? extends Enum> classType, final Enum<?> enumObj) {
            if (enumObj == null) {
                return null;
            } else {
                return enumObj.valueOf(classType, enumObj + "");
            }

用法:

 TestEnum1 enum1 = (TestEnum1) toEnum(TestEnum1.class, TestEnum1.HELLO_ENUM);

答案 3 :(得分:0)

关注不是一个要求的类,但是相对于其他一些回答,它还是有所改进,因为它不会产生警告(java 11 / IDEA 2020)

    static <Dest extends Enum<Dest>> Dest
    convertEnumStrict(final Class<Dest> destinationClassType, final Enum<?> sourceEnum) {
        if (sourceEnum == null) {
            return null;
        }
        return Dest.valueOf(destinationClassType, sourceEnum.name());
    }

    static <Dest extends Enum<Dest>> Dest
    convertEnumOrNull(final Class<Dest> destinationClassType, final Enum<?> sourceEnum) {
        try {
            return convertEnumStrict(destinationClassType, sourceEnum);
        } catch (IllegalArgumentException e) {
            return null;
        }
    }

答案 4 :(得分:0)

把两个最好的答案放在一起,你会得到一个干净的衬里:

public <T extends Enum<T>> T getEnumValue(Class<T> type, String str) {
    return Enum.valueOf(type, str);
}