java - 将 `enum constant name` 变回 `enum constant` 的通用方法

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

最佳答案

怎么样

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

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

关于java - 将 `enum constant name` 变回 `enum constant` 的通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20174931/

相关文章:

Swift Generic 在 typealias 中被视为父级

java - 如何在参数中使用字符串创建固定长度的 BigInteger

java - 是否可以使用java为音频文件添加水印?

java - 如何为文本框控件添加自定义 SWT 上下文菜单

java - return语句在递归函数调用中有不同的作用吗?

java - JPA:从另一个表加载值列表

.net - 派生类的泛型版本可以使用泛型类型重写基方法吗?

java - 为什么编译器声明不存在唯一的最大实例?

c# - 如何在 Dapper 中使用泛型和 Nullable<T> 类型进行物化?

c# - 如何在 C# 中找到泛型类的属性?