Java 编写一个泛型方法来覆盖字符串到枚举值转换的多个方法

Java 编写一个泛型方法来覆盖字符串到枚举值转换的多个方法,java,generics,enums,Java,Generics,Enums,我创建了两个Java枚举 public enum TypeEnum { TYPE_A, TYPE_B } 及 接下来,我编写了两个函数将传入字符串转换为枚举值: private TypeEnum convertType(String test) { return TypeEnum.valueOf(test); } private FormatEnum convertFormat(String test) { return FormatEnum.valueOf(test)

我创建了两个Java枚举

public enum TypeEnum {
    TYPE_A, TYPE_B
}

接下来,我编写了两个函数将传入字符串转换为枚举值:

private TypeEnum convertType(String test) {
    return TypeEnum.valueOf(test);
}
private FormatEnum convertFormat(String test) {
    return FormatEnum.valueOf(test);
}
接下来,我想将这两个转换方法统一到一个带有泛型的方法下。我试过两种方法:

private <T extends Enum> Enum convertToEnumValue(T localEnum, String value) {
    return T.valueOf(localEnum.getClass(), value);
}
private Enum convertToEnumValue(T localEnum,字符串值){
返回T.valueOf(localEnum.getClass(),value);
}

private static T convertToEnumValue(类enumType,字符串值){
返回(T)T.valueOf(枚举类型,值);
}
我无法编写对这些方法的调用来编译


有没有办法纠正这些错误以使其正常工作?

我怀疑您正在寻找以下方法:

public static <E extends Enum<E>> E toMember(Class<E> clazz, String name) {
    //TODO input validations;
    for (E member : clazz.getEnumConstants()) {
        if (member.name().equals(name)) {
            return member;
        }
    }
    return null; //Or throw element not found exception
}

//More elegant form of the previous one
public static <E extends Enum<E>> E toMember(Class<E> clazz, String name, E defaultMember) {
    //TODO input validations;
    for (E member : clazz.getEnumConstants()) {
        if (member.name().equals(name)) {
            return member;
        }
    }
    return defaultMember;
}
publicstatice-toMember(类clazz,字符串名){
//TODO输入验证;
对于(E成员:clazz.getEnumConstants()){
if(member.name().equals(name)){
返回成员;
}
}
返回null;//或抛出未找到元素异常
}
//更优雅的形式的前一个
公共静态E-toMember(类clazz、字符串名称、E-defaultMember){
//TODO输入验证;
对于(E成员:clazz.getEnumConstants()){
if(member.name().equals(name)){
返回成员;
}
}
返回默认成员;
}
请注意,通用的E扩展了Enum

…是否有办法更正它们以使其正常工作?… 我有你的例子来处理这些非常小的修正…:

class DeduperAnswer {

    private <T extends Enum> T convertToEnumValue(T localEnum, String value) {
        return ( T ) T.valueOf(localEnum.getClass(), value);
    }

    private static <T extends Enum> T convertToEnumValue(Class<T> enumType, String value) {
        return ( T ) T.valueOf(enumType, value);
    }        

    static public void main(String ...args){

        DeduperAnswer da = new DeduperAnswer();

        TypeEnum typB = da.convertToEnumValue(TypeEnum.TYPE_B, "TYPE_B");

        FormatEnum fmtX = convertToEnumValue(FormatEnum.FORMAT_X.getClass(), "FORMAT_X");
    }
}
类重复数据应答器{
私有T convertToEnumValue(T localEnum,字符串值){
返回(T)T.valueOf(localEnum.getClass(),value);
}
私有静态T convertToEnumValue(类enumType,字符串值){
返回(T)T.valueOf(枚举类型,值);
}        
静态公共void main(字符串…参数){
deduplieranswer da=新的deduplieranswer();
TypeEnum typB=da.convertToEnumValue(TypeEnum.TYPE_B,“TYPE_B”);
FormatEnum fmtX=convertToEnumValue(FormatEnum.FORMAT_X.getClass(),“FORMAT_X”);
}
}

当然,俗话说,剥猫皮的方法不止一种。但是,既然您的解决方案对您有效,您就可以开始了。

没有必要声明您自己的方法,因为JDK
java.lang.Enum
已经声明了一个:

FormatEnum y =Enum.valueOf(FormatEnum.class, "FORMAT_Y");

TypeEnum a = Enum.valueOf(TypeEnum.class, "TYPE_A");

这是因为Enum是所有枚举类型的基类,所以当您调用
TypeEnum.valueOf时
您正在调用
Enum.valueOf(s)

您也许可以将反射与
类一起使用,但是您现在拥有的应该是好的enoughHey@Rokas。这两种方法都要求调用者传入他们想要转换的任何特定类型的
Enum
。对吗?如果是这样的话,那么您认为这些方法的使用者需要将字符串转换为他们已经拥有的类型的用例是什么呢?尽管这种方法是真正的泛型方法,但它的效率并没有那么高。由于您已经知道自己的枚举类型,我建议在枚举类中为成员映射一个名称。因此,每次要按名称检索成员时,只需执行nameToMember.get(name)。这比前面介绍的迭代方法快得多,不是更容易吗?(除非您必须处理未找到案例中的异常)
class DeduperAnswer {

    private <T extends Enum> T convertToEnumValue(T localEnum, String value) {
        return ( T ) T.valueOf(localEnum.getClass(), value);
    }

    private static <T extends Enum> T convertToEnumValue(Class<T> enumType, String value) {
        return ( T ) T.valueOf(enumType, value);
    }        

    static public void main(String ...args){

        DeduperAnswer da = new DeduperAnswer();

        TypeEnum typB = da.convertToEnumValue(TypeEnum.TYPE_B, "TYPE_B");

        FormatEnum fmtX = convertToEnumValue(FormatEnum.FORMAT_X.getClass(), "FORMAT_X");
    }
}
FormatEnum y =Enum.valueOf(FormatEnum.class, "FORMAT_Y");

TypeEnum a = Enum.valueOf(TypeEnum.class, "TYPE_A");