我有以下代码
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
的情况下编译/运行代码?
答案 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
的枚举常量。
可能还有一些警告也要压制......