Java 将“枚举常量名称”转换回“枚举常量”的通用方法`

Java 将“枚举常量名称”转换回“枚举常量”的通用方法`,java,generics,Java,Generics,如何将以下名为reverse的方法重写为允许任何枚举类型的泛型方法 public class TestX { enum Gender { male, female } public static void main(String[] args) { System.out.printf("%s\n", TestX.reverse("male").name()); System.out.printf("%s\n", TestX.reverse("f

如何将以下名为
reverse
的方法重写为允许任何枚举类型的泛型方法

public class TestX {

    enum Gender { male, female }

    public static void main(String[] args) {
        System.out.printf("%s\n", TestX.reverse("male").name());
        System.out.printf("%s\n", TestX.reverse("female").name());
    }

    static Gender reverse(String name) {
        for (Gender g: Gender.class.getEnumConstants())
            if (g.name().equals(name))
                return g;
        return null;
    }
}
我尝试的内容(但没有在
T.class
编译):


我相信以下方法会奏效:

static <T extends Enum<T>> T reverse(String name, Class<T> t_class) {
    for (T t: t_class.getEnumConstants())
           if (t.name().equals(name))
                 return t;

    return null;
}
static T reverse(字符串名称、类T\u类){
对于(T:T_class.getEnumConstants())
如果(t.name().equals(name))
返回t;
返回null;
}
怎么样

// Every enum class extends Enum<ThisEnumClassName>. 
// Since we want T to be enum we must write it as "extends Enum"
// but Enum is also generic and require type of store parameters 
// so we need to describe it as Enum<T> which finally gives us - T extends Enum<T>
static <T extends Enum<T>> T reverse(String name, Class<T> clazz) {
    for (T t : clazz.getEnumConstants())
        if (t.name().equals(name))
            return t;
    return null;
}

但是当枚举没有指定元素时,这种方法不是返回
null
,而是抛出
java.lang.IllegalArgumentException

是否尝试将其重写为这样?是的,我尝试过。如果没有答案,我将很快发布一个尝试。发布它会很好,这样我们就知道您需要什么帮助,以及在答案中需要关注什么。
T.class
是泛型无法做到的事情之一,因为每个
T
都使用相同的字节码。明确地传递
是一种常见的解决方法,就像Steve P.的回答一样。我认为
是一个循环定义。不,不是。请考虑:
,这是一个通用对象列表所需的,这些对象彼此之间具有
可比性。@broiyan:否。所有枚举类型都继承自java.lang.enum,它是一个通用类。当您编写
public enum MyEnum
时,MyEnum将成为
enum
的缩写。因此,为接受enum
public void myMethod(){…}
的泛型方法编写一个有界类型参数正是所需的。这可以正常工作。由于
T
是一个
Enum
name()
调用不应引发异常。@broiyan调用很好。忘了吧。
// Every enum class extends Enum<ThisEnumClassName>. 
// Since we want T to be enum we must write it as "extends Enum"
// but Enum is also generic and require type of store parameters 
// so we need to describe it as Enum<T> which finally gives us - T extends Enum<T>
static <T extends Enum<T>> T reverse(String name, Class<T> clazz) {
    for (T t : clazz.getEnumConstants())
        if (t.name().equals(name))
            return t;
    return null;
}
Enum.valueOf(YourEnumClass.clazz, "ENUM_FIELD_NAME")