【发布时间】:2018-01-31 10:19:32
【问题描述】:
这个问题与to a previous question有关。可以通过添加强制转换来进行未经检查的转换来解决原始问题。所以现在我有以下代码:
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());
}
...两者实际上相似(主要区别在于foo1() 中的E1 e 参数)。然而foo1() 编译,但foo4() 不编译。我觉得这很矛盾。是否有任何规则允许对泛型方法进行隐式转换?
【问题讨论】:
标签: java generics type-inference unchecked-conversion