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

标签 java generics bounded-wildcard

我想知道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/

相关文章:

java - Hibernate映射类型和保存类型

c# - 为什么接口(interface)列表不能使用实现类型?

java - 需要帮助理解此方法

Java:通配符边界的非运算符

java - Java 构造函数中的泛型?

java - Java 中使用 Flatbuffers 进行字符串去重

java - 将 Java 应用程序连接到 IBM Bluemix 中的 SQL 数据库

java - 在线程之间传递对象

c# - Func<S, T> 的 T 仅在 S 和 T 不同时才从 lambda 表达式的输出中推断出来?

java - 关于Java中通配符的简单说明