java génériques et de la méthode addAll
Est-ce le bon type de l'argument de la addAll(..) la méthode en Java collections? Si je fais quelque chose comme ceci:
List<? extends Map<String, Object[]>> currentList = new ArrayList<Map<String, Object[]>>();
Collection<HashMap<String, Object[]>> addAll = new ArrayList<HashMap<String, Object[]>>();
//add some hashmaps to the list..
currentList.addAll(addAll);
Je comprends que j'ai besoin d'initialiser les variables. Cependant, je reçois une erreur de compilation (eclipse):
Multiple markers at this line
- The method addAll(Collection<? extends capture#1-of ? extends Map<String,Object[]>>) in the type List<capture#1-of ? extends Map<String,Object[]>> is not applicable for the arguments (List<capture#2-of ? extends
Map<String,Object[]>>)
- The method addAll(Collection<? extends capture#1-of ? extends Map<String,Object[]>>) in the type List<capture#1-of ? extends Map<String,Object[]>> is not applicable for the arguments
(Collection<HashMap<String,Object[]>>)
ce que je fais mal?
- Pouvez-vous modifier pour afficher vos déclarations pour à la fois "currentList" et "newElements'?
- Je pense que "newElements' est censé être "addAll' j'ai corrigé le code.
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez insérer des instances de
T
dans unList<T>
.Le type
List<? extends Map<X,Y>>
représente une liste d'un inconnu typeT
quiextends Map<X,Y>
. Par exemple, il pourrait se présenter pour unList<LinkedHashMap<X,Y>>
. Évidemment, vous ne pouvez pas insérer un ordinaireHashMap<X,Y>
dans une telle liste.Vous voulez probablement:
Ou si vous voulez être vraiment souple que vous pouvez faire:
Qui vous permettrait de faire des choses folles comme:
Vous pouvez également lire Angelika de Langer Génériques FAQ, en particulier la section sur les caractères génériques.
Remplacer
extends
parsuper
.La
addAll()
lui-même prend un? extends T
argument et qui ne fonctionne pas lorsqueT
est? extends Map<K, V>
. Avec le changement, il deviendra effectivement? extends ? super Map<K, V>
.Mais encore, mieux, c'est juste pour enlever ce
? extends
(ou? super
). Il est superflu dans ce cas particulier. Utilisez simplementList<Map<String, Object[]>>
. LeaddAll()
va alors prendre? extends Map<String, Object[]>>
.currentList
commeList<? super Map<String, Object[]>>
, et pas seulementList<Map<String, Object[]>>
? cette partie de son code ne semble pas nécessaire pour moi.rappelez-vous juste:
pour
<? extends ...>
, vous ne pouvez pas mettre les choses (sauf null), etpour
<? super ...>
, vous ne pouvez pas obtenir les choses (à l'exception de l'Objet) en dehors de çaVous ne pouvez pas appeler n'importe quelle méthode avec les attributs génériques sur une telle liste. Fondamentalement, ce que
? extends Foo
dit est "quelque chose qui s'étendFoo
", mais vous ne savez pas ce qu'est une chose. Lorsque ce type est retourné, vous pouvez dire que la valeur retournée estFoo
ou de certains sous-type. Mais pour une valeur de vous ne pouvez pas vous qu'elle correspond à? extends Foo
générique.En bref: vous avez besoin de changer
currentList
déclaration ou jeter auxList
(sans génériques) et de vivre avec un avertissement ou, si vous savez ce que vous faites) de la supprimer.Votre question, fondamentalement, se résume à ceci:
Ceci ne fonctionnera pas avec essentiellement la même erreur que vous décrivez. Essayez quelque chose le long de ces lignes pour le fixer.
Sinon, dans ton exemple ci-dessus, vous pourriez changer
à
Génériques obtient poilu assez rapidement si vous essayez de commencer à passer de type non spécifié.