[英]Fully qualified generics type casting error overlooked by Java compiler?
众所周知,泛型意味着在编译时进行更强大的类型检查。 但是,在研究官方Java教程时,我遇到了这个问题:
However, in some cases the compiler knows that a type parameter is always valid and allows the cast. For example:
List<String> l1 = ...;
ArrayList<String> l2 = (ArrayList<String>)l1; // OK
来自http://docs.oracle.com/javase/tutorial/java/generics/restrictions.html#cannotCast 。
我已经尝试并测试了这一点(它完全反映了文档):
List<String> l1 = new LinkedList<String>();
ArrayList<String> l2 = (ArrayList<String>)l1; // OK
尽管一切都非常明确(没有分配给Object
变量,没有使用通配符等),但是编译器无法预测随后出现的运行时错误:
Exception in thread "main" java.lang.ClassCastException: java.util.LinkedList cannot be cast to java.util.ArrayList
100%不解。
重新读取链接-并不是说您可以将LinkedList
转换为ArrayList
。 它说明您可以向下转换一个List
的String
到(大概是程序员知道)类型的ArrayList
的String
。 他们试图说明的是通用类型参数之间的差异。 他们的第一个示例显示了从Integer
集合到Number
集合的强制转换。
通常,除非使用不受限制的通配符对其进行参数化,否则无法将其转换为参数化类型。 例如:
列表li = new ArrayList <>(); 列表ln =(列表)li; //编译时错误
但是,在某些情况下,编译器知道类型参数始终有效并允许强制转换。 例如:
列表l1 = ...; ArrayList l2 =(ArrayList)l1; // 好
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.