Java泛型是不变的,因此无法进行此类转换:
List<Object> li = (List<Object>)new ArrayList<Integer>();
但是在下面的第4行代码中,我可以从转换List<Integer>
为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);
}
}
在Java中,执行在编译时已知总是不正确或始终正确的显式强制转换是编译错误。在编译时,从List<Integer>
toList<Object>
强制转换始终是不正确的,因此是不允许的。从铸造List<Integer>
到List<T>
在编译时不知道是不正确始终-这将是正确的,如果T
是Integer
,并T
在编译的时候是不知道。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句