简体   繁体   English

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

[英]Alternatives to Enum.valueOf for a generic that doesn't extend Enum?

I have the following code 我有以下代码

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

that IDEA reports the error Wrong 1st argument type. Found: 'java.lang.Class<T>', required: 'java.lang.Class<T>' IDEA报告错误的Wrong 1st argument type. Found: 'java.lang.Class<T>', required: 'java.lang.Class<T>' Wrong 1st argument type. Found: 'java.lang.Class<T>', required: 'java.lang.Class<T>' on in valueOf function. valueOf函数中Wrong 1st argument type. Found: 'java.lang.Class<T>', required: 'java.lang.Class<T>' I can avoid this error by specifying <T extends Enum<T>> in the function header but the idea is that T can be a wide range of types, not just enums. 我可以通过在函数头中指定<T extends Enum<T>>来避免此错误,但是想法是T可以是多种类型,而不仅仅是枚举。 Is it possible to get the code to compile/run without restricting T ? 是否可以在不限制T情况下编译/运行代码?

I didn't use Enum.valueOf() , instead I used Class.getEnumConstants() 我没有使用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;
}

This way it compiles without warning, but I'm not sure if this is what you want. 这样,它可以毫无警告地进行编译,但是我不确定这是否是您想要的。

Quick, unpleasant answer (I'm sure there's better ones). 快速,令人不快的答案(我敢肯定会有更好的答案)。

You can always just cast c to Class before using it in valueOf . valueOf使用c之前,您始终可以将其valueOfClass So 所以

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

would work; 会工作; provided you know the only Enum class that can be provided has an enum constant named string . 如果您知道唯一可以提供的Enum类具有一个名为string的枚举常量。

Probably some warnings to suppress there too... 可能也有一些警告要禁止在那里...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM