对于不扩展Enum的泛型,Enum.valueOf的替代方案?

时间:2017-11-29 18:01:27

标签: java generics enums

我有以下代码

protected <T> T func(Class<T> c) {
    if (c.isEnum()) {
        try {
            return c.cast(Enum.valueOf(c, "string"));
        } catch (IllegalArgumentException e) {
            return null;
        }
    }
    return null;
}

IDEA报告Wrong 1st argument type. Found: 'java.lang.Class<T>', required: 'java.lang.Class<T>'函数中的错误valueOf。我可以通过在函数头中指定<T extends Enum<T>>来避免此错误,但我们的想法是T可以是各种类型,而不仅仅是枚举。是否可以在不限制T的情况下编译/运行代码?

2 个答案:

答案 0 :(得分:3)

我没有使用Enum.valueOf(),而是使用了Class.getEnumConstants()

protected <T> T func(Class<T> c) {
    if (c.isEnum())
        for (T t : c.getEnumConstants())
            if (((Enum<?>) t).name().equals("KG"))
                return t;
    return null;
}

这样它可以在没有警告的情况下编译,但我不确定这是否是你想要的。

答案 1 :(得分:-1)

快速,不愉快的回答(我确信有更好的答案)。

您可以随时将c投射到Class,然后才能在valueOf中使用它。所以

return (T) Enum.valueOf((Class) c, "string");

会起作用;如果您知道可以提供的唯一Enum类具有名为string的枚举常量。

可能还有一些警告也要压制......