繁体   English   中英

Java编译器忽略了完全合格的泛型类型转换错误?

[英]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 它说明您可以向下转换一个ListString到(大概是程序员知道)类型的ArrayListString 他们试图说明的是通用类型参数之间的差异。 他们的第一个示例显示了从Integer集合到Number集合的强制转换。

通常,除非使用不受限制的通配符对其进行参数化,否则无法将其转换为参数化类型。 例如:

列表li = new ArrayList <>(); 列表ln =(列表)li; //编译时错误

但是,在某些情况下,编译器知道类型参数始终有效并允许强制转换。 例如:

列表l1 = ...; ArrayList l2 =(ArrayList)l1; // 好

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM