作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想知道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>>
最佳答案
ArrayList
是Iterable
,你是对的,所以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/
我是一名优秀的程序员,十分优秀!