Java 泛型是不变的,所以不可能进行这样的转换:
List<Object> li = (List<Object>)new ArrayList<Integer>();
但是在第 4 行的以下代码中,我可以转换 from List<Integer>
to List<T>
,其中T
可以是任何类型。为什么允许这种类型的演员表?
我知道它会生成有关未经检查的强制转换的警告,但关键是这种强制转换在参数化方法中是可能的,但在普通代码中是不可能的。请记住,泛型是不变的,为什么允许它?在正常代码中,List<Integer>
我只能将其转换List<Integer>
为没有意义的转换,而其他转换是非法的。那么在第 4 行中允许这样的转换有什么意义呢?
我知道泛型类型在编译时被删除并以 结尾List xlist = (List)list
,但在删除这些类型之前,很明显不应允许这种强制转换,除非它仅在有人通过 Integer 的情况下被接受,因为el
这没有多大意义.
class Test {
public static <T> void t(List<Integer> list, T el) {
List<T> xlist = (List<T>)list; //OK
xlist.add(el);
}
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
t(list, "a");
t(list, "b");
//prints [a, b] even if List type is Integer
System.out.println(list);
}
}