这个问题与上一个问题有关。可以通过添加强制转换来进行未经检查的转换来解决原始问题。所以现在我有以下代码:
import java.util.EnumSet;
class A {
static enum E1 {
X
}
private static <T extends Enum<T>> EnumSet<T> barEnum(Class<T> x) {
return null;
}
private static void foo1(EnumSet<E1> s, E1 e) {
EnumSet<E1> x2 = barEnum((Class<E1>)e.getClass());
}
private static void foo2(EnumSet<E1> s) {
EnumSet<E1> x = barEnum((Class<E1>)s.iterator().next().getClass());
}
}
我的初衷是写一个泛型方法。所以我将方法概括foo2()
为:
private static <E extends Enum<E>> void foo3(EnumSet<E> s) {
EnumSet<E> x = barEnum(s.iterator().next().getClass());
}
这显然包含未经检查的转换,并带有适当的警告进行编译。但我没有getClass()
明确地将结果转换为Class<E>
. 由于foo1()
是泛型方法的一个实例foo3()
,我预计我也需要在这里添加演员表。比较... foo1()
_foo4()
private static void foo4(EnumSet<E1> s) {
EnumSet<E1> x = barEnum(s.iterator().next().getClass());
}
...两者实际上相似(主要区别在于E1 e
参数foo1()
)。然而foo1()
编译,但foo4()
不编译。我觉得这很矛盾。是否有任何规则允许对泛型方法进行隐式转换?