gpt4 book ai didi

java - 为什么 ArrayList> 到 Iterable> 的隐式转换是不可能的?

转载 作者:搜寻专家 更新时间:2023-11-01 02:44:16 24 4
gpt4 key购买 nike

我想知道Java不能投ArrayList<ArrayList<T>>的原因至 Iterable<Iterable<T>>含蓄地。我的问题不是关于如何明确地做到这一点。

为什么会出现下面的代码:

import java.util.Iterator;
import java.util.ArrayList;

public class Test {
public Test() {
ArrayList<ArrayList<Test>> arr = new ArrayList();
Iterable<Iterable<Test>> casted = arr;
}
}

编译时出现以下错误?

Test.java:7: error: incompatible types: ArrayList<ArrayList<Test>> cannot be converted to Iterable<Iterable<Test>>

最佳答案

ArrayListIterable ,你是对的,所以ArrayList<ArrayList<Test>>Iterable<ArrayList<Test>> .

但是 Iterable<Iterable<Test>>不是 Iterable<ArrayList<Test>> ,因为在这种情况下,您当然不能明确地向 Iterable 添加内容, 但有可能的情况,你可以(用其他例子),所以你可以添加,例如,Set<Test>在里面,所以这会打破arr .

您可以使用有界泛型来解决这个问题:

Iterable <? extends Iterable<Test>> casted = arr;

所以,当你运行 iterator()casted你会得到Iterator<? extends Iterable<Test>>每个next()你会得到? extends Iterable<Test> ,即 Iterable<Test> .

您应该阅读有关 covariance and countervariance in Java 的内容得到这个。

关于java - 为什么 ArrayList<ArrayList<T>> 到 Iterable<Iterable<T>> 的隐式转换是不可能的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26303467/

24 4 0