有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java泛型方法将`enum常量名称`转换回`enum常量`

如何将以下名为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编译):

<T extends Enum<?>> T reverse2(String name) {
     for (T t: T.class.getEnumConstants())
         if (t.name().equals(name)) return t; 
     return null; 
}

共 (2) 个答案

  1. # 1 楼答案

    我相信以下措施会奏效:

    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;
    }
    
  2. # 2 楼答案

    怎么样

    // 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;
    }
    

    如果要使其通用,则需要指定要从哪个枚举获取值。否则就无法找到正确的enym(除非您也将它放在name中的某个地方,比如full.package.name.of.YourEnum.VALUE


    你也可以考虑使用

    Enum.valueOf(YourEnumClass.clazz, "ENUM_FIELD_NAME")
    

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