2011-02-17 2 views
2

Peut-être que je manque quelque chose, mais je pensais que si je déclare ma classe en tant que telle:Java Iterable <Iterable<T>> à ArrayList <ArrayList<T>>

public class Something<T> implements Iterable<Iterable<T>> { 
    public Something(Iterable<Iterable<T>> input) { 
    ... 

je devrais pouvoir instancier comme tel:

ArrayList<ArrayList<String>> l = new ArrayList<ArrayList<String>>(); 

Something<String> s = Something<String>(l); 

Malheureusement ceci me gages une erreur. Je pensais que les ArrayLists sont Iterable, ce qui devrait correspondre exactement à la définition de mon constructeur.

Répondre

7

Vous devez modifier votre constructeur d'accepter tout ce qui étend Iterable<T>

public Something(Iterable<? extends Iterable<T>> list){} 

La raison est parce que les types génériques ne peuvent pas étendre littéralement d'autres types génériques. Un List<String> ne peut pas être affecté à un List<CharSequence>. Le mot-clé extends permet ce type d'affectation.

+0

Merci, mais maintenant je reçois des avertissements ici: 'public class Quelque chose implémente Iterable > { \t \t Iterable privée > entrée; \t \t Quelque chose publique (Iterable > entrée) { \t \t this.input = (Iterable >) entrée; \t} ' – Pass

+0

Je suggère de trouver une copie de Java efficace par Josh Bloch et lire sur" PECS ". Cela vous aidera à comprendre vraiment ce qui se passe. Dans tous les cas, vous devez avoir Iterable 'partout où vous vous attendez à affecter' ArrayList > ' – Jeremy

+0

ou peut-être même' Iterable > ' – newacct

Questions connexes