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

时间:2013-11-24 13:19:42

标签: 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("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 个答案:

答案 0 :(得分:6)

怎么样

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

答案 1 :(得分:2)

我相信以下内容可行:

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