【发布时间】:2014-04-20 00:50:26
【问题描述】:
这一定是小事,但我不明白。
当它具有与Enum 的valueOf 中完全相同的泛型声明时,为什么会导致未经检查的强制转换编译器警告?
public static final <T extends Enum<T>> Enum toValue(T for_value, String value) {
try {
return Enum.<T>valueOf((Class<T>)for_value.getClass(), value);
} catch(RuntimeException rx) {
throw new IllegalArgumentException(value);
}
}
编译器警告:
R:\jeffy\programming\sandbox\xbnjava\xbn\util\EnumUtil.java:92:
warning: [unchecked] unchecked cast
Enum.<T>valueOf((Class<T>)for_value.getClass(), value);
^
required: Class<T>
found: Class<CAP#1>
where T is a type-variable:
T extends Enum<T> declared in method <T>toValue(T,String,String)
where CAP#1 is a fresh type-variable:
CAP#1 extends Enum from capture of ? extends Enum
R:\jeffy\programming\sandbox\xbnjava\xbn\util\EnumUtil.java:98: error: missing return statement
}
^
1 error
1 warning
它也发生在一个或两个泛型被从函数调用中移除,例如
Enum.valueOf(for_value.getClass(), value);
这是我发现的最接近的问题:Enum.valueOf throws a warning for unknown type of class that extends Enum?。这个枚举的类型是已知的。
【问题讨论】:
-
我实际上应该返回
T,而不是Enum,尽管这不会停止警告。