Envoyé par
grunt2000
Je ne vois pas d'ambiguïté, ou de cas où cela pourrait réellement coincer.
Tu ne connais pas le type précis de la liste, donc tu ne peux pas y ajouter d'élément.
Par exemple si tu fais ceci :
1 2
| List<? extends Fruit> list = ...
list.add(new Pomme("Pomme rouge")); // Erreur de compilation |
Tu ajoutes une Pomme dans une liste dont tu ne connais pas le paramétrage exact. Le compilateur ne peut donc pas t'assurer que ce code sera valide sans erreur lors de l'exécution, et il génère donc une erreur.
Ainsi si la liste est déclarée comme ceci :
List<? extends Fruit> list = new ArrayList<Pomme>();
Cela pourrait marcher (si c'était autorisé par le langage).
Mais si la liste est déclarée comme ceci :
List<? extends Fruit> list = new ArrayList<Banane>();
Ce serait incorrect car tu ajouterais une Pomme dans une liste censé contenir uniquement des Bananes
Les wildcards te donne une vision limité sur l'objet, c'est normal et c'est voulu puisque tu ne connais pas le type exact.
Ceci est la base même de l'objectif des Generics : générer un code typesafe qui ne génèrera pas d'erreur de typage à l'exécution.
C'est le principe inverse des tableaux, avec lesquelles un code peut compiler parfaitement mais générer des erreurs à l'exécution :
1 2 3
| Fruit[] fruits = new Pomme[5];
fruits[0] = new Banane(); // java.lang.ArrayStoreException |
Plutôt que de t'entêter à utiliser les wildcards de cette manière, expliques précisément ce que tu voudrais faire...
a++
PS : Et il y a une raison pour que tu utilises des Vectors à la place des List/ArrayList ???
Partager