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>>
+4
source share
4 answers

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, .

+2

Generics. :

ArrayList<ArrayList<Test>> arr = new ArrayList();
Iterable<? extends Iterable<Test>> casted = arr;

ArrayList<ArrayList> Iterable<Iterable>, . ArrayList Iterable, ? extends Iterable

.

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

. casted . add , .

+2

:

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>. , , , .

+1

- , . , , :

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>.

-1

All Articles