Why is implicit listing of ArrayList <ArrayList <T>> for Iterable <Iterable <T>> impossible?
I would like to know why Java cannot use ArrayList<ArrayList<T>>to Iterable<Iterable<T>>implicitly. My question is not how to do this explicitly.
Why the following code:
import java.util.Iterator;
import java.util.ArrayList;
public class Test {
public Test() {
ArrayList<ArrayList<Test>> arr = new ArrayList();
Iterable<Iterable<Test>> casted = arr;
}
}
cause the following error during compilation:
Test.java:7: error: incompatible types: ArrayList<ArrayList<Test>> cannot be converted to Iterable<Iterable<Test>>
ArrayList Iterable, you are right, therefore ArrayList<ArrayList<Test>>there is 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>.
- Java, .
:
public final class Test {
public Test() {
final ArrayList<ArrayList<Test>> a1 = new ArrayList<>();
final ArrayList<? extends Iterable<Test>> valueTypeRef = a1;
final Iterable<? extends Iterable<Test>> spinalTypeRef = valueTypeRef;
final ArrayList<Iterable<Test>> a2 = new ArrayList<>();
final Iterable<Iterable<Test>> r2 = a2;
}
}
a1 , , , ( "", ). (a2) , Iterable , .
, valueTypeRef ArrayList<Iterable<Test>>, . Java ArrayList<ArrayList<Test>> ArrayList<Iterable<Test>>, ArrayList<Test>> Iterable<Test>. valueTypeRef , , , , , .
, Java , - , Java. ( ArrayList<? extends Iterable<Test>>), , , .
; , (, ArrayList<ArrayList<Test>> ArrayList<Iterable<Test>>) .
( , ArrayList<? extends Iterable<Test>>) , - , Iterable<Test>, ArrayList<Test>. , , , .
- , . , , :
import java.util.Iterator;
import java.util.ArrayList;
public class Test {
public Test() {
ArrayList<ArrayList<Test>> arr = new ArrayList();
Iterable<Iterable<Test>> casted = (Iterable<Iterable<Test>>)(Iterable<?>)arr;
}
}
. , Iterable , ArrayList<ArrayList> ArrayList<LinkedList>, , , arr.
, ArrayList<ArrayList> Iterable<Iterable> , . ( ) ArrayList<ArrayList> Iterable<? extends Iterable> Iterable<? extends Iterable>, Iterable<Iterable>.
Iterable<Iterable> - Iterable<? extends Iterable>.