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

Java 如何创建通用枚举转换器?,java,generics,enums,Java,Generics,Enums,我想写一个泛型类,可以像newenumconverter(MyEnum.class)那样使用 但是我必须编写这个类,以便它能够与对enum.values()的泛型调用一起工作 公共类枚举转换器{ 公共EnumConverter(候选类:type.getDeclaringClass().getEnumConstants()){ if(candidate.name().equalsIgnoreCase(文本)){ 返回候选人; } } } } 方法转换的返回类型错误:应该是Enum而不是EnumCo

我想写一个泛型类,可以像
newenumconverter(MyEnum.class)那样使用

但是我必须编写这个类,以便它能够与对
enum.values()
的泛型调用一起工作

公共类枚举转换器{
公共EnumConverter(候选类:type.getDeclaringClass().getEnumConstants()){
if(candidate.name().equalsIgnoreCase(文本)){
返回候选人;
}
}
}
}

方法转换的返回类型错误:应该是
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;
    }
}
公共静态类枚举转换器
{
班级类型;
公共枚举转换器(类类型)
{
this.type=type;
}
公共枚举转换(字符串文本)
{
对于(枚举候选:type.getEnumConstants()){
if(candidate.name().equalsIgnoreCase(文本)){
返回候选人;
}
}
返回null;
}
}

您的问题不一致,代码无效: 1) 未将this.type定义为字段 2) 您可以定义convert to return
EnumConverter
,但返回
Enum

要从文本中返回枚举的枚举值,不需要使用泛型内容。您只需使用:

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

以防有些人在寻找替代解决方案时不使用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 + "");
            }

下面的类与request不同,但与其他一些答案相比还是有所改进,因为它不会产生警告(Java11/IDEA 2020)

静态Dest
convertEnumStrict(最终类destinationClassType,最终枚举sourceEnum){
if(sourceEnum==null){
返回null;
}
返回Dest.valueOf(destinationClassType,sourceEnum.name());
}
静态目的地
convertEnumOrNull(最终类destinationClassType,最终枚举sourceEnum){
试一试{
返回convertEnumStrict(destinationClassType,sourceEnum);
}捕获(IllegalArgumentException e){
返回null;
}
}

把两个最好的答案放在一起,你会得到一个清晰的答案:

public <T extends Enum<T>> T getEnumValue(Class<T> type, String str) {
    return Enum.valueOf(type, str);
}
public T getEnumValue(类类型,字符串str){
返回枚举值of(类型,str);
}

这是什么类型的。type;它是如何声明的?您的convert方法有问题,因为它应该返回
EnumConverter
,而
candidate
的类型是
Enum
!!我认为这是一个建构主义者,我绝对不清楚问题是什么,问得好。这是相关的,但不同:(请不要把这个评论读成‘嘿,这个问题是个骗局!’)这正是我想要的。但是这不能进一步优化吗,因为我必须提供类型参数作为泛型参数和构造函数参数,比如
newenumconverter(MyEnum.class)或<代码>新建EnumConverter()?为什么使用这个类与使用Enum.valueOf((类enumType,字符串名)
?我在写这个答案时不知道Enum.valueOf()-方法,只是想说明如何让他的方法工作。也许你可以用它来跟踪转换;-)@membersound可以通过在通用静态方法中进行转换来进一步优化它。但是您可以直接使用Enum.valueOf()。
 TestEnum1 enum1 = (TestEnum1) toEnum(TestEnum1.class, TestEnum1.HELLO_ENUM);
    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;
        }
    }
public <T extends Enum<T>> T getEnumValue(Class<T> type, String str) {
    return Enum.valueOf(type, str);
}