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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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.