gpt4 book ai didi

Java 泛型 : Cannot cast List to List?

转载 作者:IT老高 更新时间:2023-10-28 11:26:01 26 4
gpt4 key购买 nike

刚刚遇到这个问题:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com