Question de généricité et d'héritage
Citation:
Résumé :
On ne peut pas passer une Collection<List<Collection<String>>> à une méthode qui prend comme paramètre une Collection<Collection<Collection<String>>>.
Pourquoi?
Je constate que le code suivant ne passe pas :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| public class Test {
public Test() {
Collection<List<Collection<String>>> c = new ArrayList<List<Collection<String>>>();
List<Collection<String>> c1 = new ArrayList<Collection<String>>();
Collection<String> c2 = new ArrayList<String>();
c2.add("test1");
c2.add("test2");
c1.add(c2);
c2 = new ArrayList<String>();
c2.add("test3");
c1.add(c2);
c.add(c1);
c1 = new ArrayList<Collection<String>>();
c2 = new ArrayList<String>();
c2.add("test4");
c1.add(c2);
c.add(c1);
print(c);
}
private void print(Collection<Collection<Collection<String>>> c) {
System.out.println("Résultat :");
for(Collection<Collection<String>> c1 : c) {
for (Collection<String> c2 : c1) {
for (String s : c2) {
System.out.println(s);
}
}
}
}
} |
il génère l'erreur de compilation suivant sur l'appel de print(c) :
Code:
1 2 3 4
| /home/[*******]/devel/java/TestApplication/src/testapplication/Test.java:38:
print(java.util.Collection<java.util.Collection<java.util.Collection<java.lang.String>>>)
in testapplication.Test cannot be applied to
(java.util.Collection<java.util.List<java.util.Collection<java.lang.String>>>) |
La question est pourquoi ? Une List est pourtant une Collection. Mais le compilateur ne semble pas apprécier l'utilisation d'une interface enfant dans le cas d'une généricité imbriquée.