Généricité cours 6 - question

Programmation Avancée

Modérateur : douinj

charp_n1
Messages : 23
Inscription : 07 oct. 2020 17:35

Généricité cours 6 - question

Message par charp_n1 » 08 nov. 2020 1:49

Bonjour,

J'ai fait quelques tests suite à la partie généricité du cours 6, et j'arrive à une erreur que je ne comprends pas :

Code : Tout sélectionner

Set<? extends List<String>> s = new Hashset<List<String>>();
s.add(new LinkedList<String>());
-> Erreur de compilation :
incompatible types : LinkedList<String> cannot be converted to capture#1 of ? extends List<String>
Pourtant, je déclare bien un ensemble d'objets qui implémentent List<String>, donc je devrais pouvoir ajouter une LinkedList.
Qu'est-ce que j'ai manqué ?

douinj
Messages : 204
Inscription : 18 mars 2009 15:46

Re: Généricité cours 6 - question

Message par douinj » 08 nov. 2020 9:14

Bonjour,

Revoyez les diapositives " par l"absurde" 13 à 31

Bonne lecture

charp_n1
Messages : 23
Inscription : 07 oct. 2020 17:35

Re: Généricité cours 6 - question

Message par charp_n1 » 09 nov. 2020 1:26

Aïe, c'est vraiment délicat...
J'ai compris que ma généricité est du type 'read-only'.
Sans le ? extends List, je peux à nouveau insérer tout type de liste dans mon ensemble :

Code : Tout sélectionner

Set<List<String>> s = new HashSet<List<String>>();
s.add(new LinkedList<String>()); // C'est bon
J'en conclus que mon instruction initiale n'a pas sens, puisque je déclare un ensemble dans lequel je ne pourrai jamais rien ajouter (trop fort)...

Code : Tout sélectionner

Set<? extends List<String>> s = new HashSet<List<String>>();
List<String> l1 = new LinkedList<String>(); // List<String> échouera, LinkedList<String> aussi, en fait RIEN NE PASSE ???
//s.add(l1); // incompatibles types : List<String> cannot be converted to ? extends List<String>
La seule chose qu'accepterait mon ensemble serait un objet déclaré (et pas seulement constaté) ? extends List : or je ne vois pas comment en déclarer un.

Je trouve étrange que le compilateur me laisse déclarer une variable (ici s) aussi absurde sans m'en avertir : par curiosité, existe-t-il un cas où cette déclaration (dans le corps d'une méthode) aurait un sens ? Ou la même question posée autrement : par quoi devrait-on remplacer List<String> li1 pour pouvoir faire un add dans cet ensemble ?

douinj
Messages : 204
Inscription : 18 mars 2009 15:46

Re: Généricité cours 6 - question

Message par douinj » 09 nov. 2020 18:03

Bonjour
puisque je déclare un ensemble dans lequel je ne pourrai jamais rien ajouter (trop fort)...
Et avec cette déclaration, vous ne pourrez qu'ajouter ...

Set<? super List<String>> s = new HashSet<List<String>>();

diapositive 34

Bons test

Répondre