Java 泛型 : Cannot cast List<SubClass> to List<SuperClass>?

标签 java generics

刚刚遇到这个问题:

List<DataNode> a1 = new ArrayList<DataNode>();
List<Tree> b1 = a1;  // compile error: incompatible type

DataNode 类型是 Tree 的子类型。

public class DataNode implements Tree

令我惊讶的是,这适用于数组:

DataNode[] a2 = new DataNode[0];
Tree[] b2 = a2;   // this is okay

这有点奇怪。任何人都可以对此作出解释吗?

最佳答案

您在第二种情况下看到的是数组协方差。这是 IMO 的一件坏事,它使数组中的分配不安全 - 尽管在编译时很好,但它们在执行时可能会失败。

在第一种情况下,假设代码确实编译了,然后是:

b1.add(new SomeOtherTree());
DataNode node = a1.get(0);

你希望发生什么?

你可以这样做:

List<DataNode> a1 = new ArrayList<DataNode>();
List<? extends Tree> b1 = a1;

... 因为那样你就只能从 b1 中获取东西,而且它们保证与 Tree 兼容。你不能准确地调用 b1.add(...) 因为编译器不知道它是否安全。

看看this section of Angelika Langer's Java Generics FAQ了解更多信息。

关于Java 泛型 : Cannot cast List<SubClass> to List<SuperClass>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3246137/

相关文章:

java - 在 android 中恢复下载时视频文件已损坏

使用 EJB 计时器的 Java EE 调度程序任务

java - < 是什么意思?超虚空>是什么意思?

C# 泛型和集合

c - 泛型表达式的副作用

java - 让应用程序的多个实例在 Apache Tomcat 中运行的最佳方法是什么?

java - 在 Eclipse E4 中设置固定零件尺寸

java - 通过http post请求发送键值参数和json消息体

java - Scala 类 Final def this() 声明没有公共(public)无参构造函数

ios - 无法使用类型为 'handler' 的参数列表调用 '([Post])'