作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
刚刚遇到这个问题:
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/
我是一名优秀的程序员,十分优秀!