Java Générique avec ArrayList <? s'étend A> ajouter un élément
J'ai des cours A
, B
, C
et D
où B
s'étend A
, C
s'étend A
et D
s'étend A
.
J'ai le texte suivant ArrayList
s chacune avec quelques éléments:
ArrayList<B> b;
ArrayList<? extends A> mix = b;
J'ai prévu pour la variable mix
contenir des éléments de type B
, C
ou D
. J'ai essayé d'ajouter un élément de type C
en mix
comme ceci:
mix.add(anElementOfTypeC);
Mais l'IDE ne m'autorise pas à le faire et il dit:
anElementOfTypeC ne peuvent être converties en CAP#1 par la méthode d'invocation
conversion où CAP#1 est un nouveau type de variable: CAP#1 s'étend à partir d'Un
capture d' ? s'étend Un
Ai-je utiliser le <? extends A>
correctement? Comment puis-je résoudre ce problème?
- À partir de votre code, extrait de
mix
est en fait unArrayList<B>
ici... - Au cours de votre recherche, - si vous avez fait certains, avez-vous venu à travers cette SORTE de question - stackoverflow.com/questions/1910892/... ?
Vous devez vous connecter pour publier un commentaire.
ArrayList<? extends A>
moyen d'une liste de tableaux de certains type inconnu qui s'étendA
.Ce type pourrait ne pas être
C
, de sorte que vous ne pouvez pas ajouter unC
à la liste de tableaux.En fait, car vous ne savez pas ce que la liste de tableaux est censé contenir, vous ne pouvez pas ajouter de rien à la liste de tableaux.
Si vous voulez une liste de tableaux qui peuvent contenir n'importe quelle classe qui hérite de
A
, utiliser unArrayList<A>
.null
, ou nous pouvons ajouterlist.get(0)
retour à la liste. Je sais que je vais chercher trop. 😉Class<? extends A> c = B.class
... les Génériques de me donner un vrai casse-tête :/list.get(0)
retour à la listeList<T>
, pasList<? extends A>
, qui est le sujet du commentaire.List<? extends A>
à cette liste. mix est de typeList<? extends A>
.List<? extends A>
. Mais au point où on en est "l'ajout delist.get(0)
", c'est unList<T>
. C'est toute la différence.Il n'est pas possible d'ajouter des éléments dans la collection qui utilise
? extends
.ArrayList<? extends A>
signifie que c'est unArrayList
de type (exactement un type) qui s'étendA
. De sorte que vous pouvez être sûr que lorsque vous appelezget
méthode, vous obtiendrez quelque chose de que est A. Mais vous ne pouvez pas ajouter quelque chose parce que vous ne savez pas exactement ce que contientArrayList
.List<? extends A> list;
signifie que la "liste" se réfère à un objet mise en œuvre de l'interface de la Liste, et la liste peut contenir des éléments hérités de la classe A (y compris A). En d'autres mots, les énoncés suivants sont corrects:Java les génériques sont une compilation de vérification de type fort.
Le compilateur utilise des génériques pour être sûr que votre code n'ajoutez pas de mal d'objets dans une collection.
Vous avez essayé d'ajouter
C
dansArrayList<B>
S'il était permis à l'objet
ArrayList<B>
contiendrait des différents types d'objet (B,C).C'est pourquoi le référence listB1 fonctionne en 'lecture seule' mode. En outre, vous pouvez prendre un coup d'oeil à cette réponse.
Vous pouvez simplement déclarer:
Vous pouvez ajouter n'importe quel élément de classe A ou de l'un quelconque de ses sous-classes dans une telle liste. C'est juste que quand vous obtenez à partir de cette liste, vous serez en mesure d'appeler des méthodes disponibles sur
A
.Noter que
A
n'est pas limité à un "à part entière" de la classe: elle peut être une classe abstraite ou même une interface.Vous pouvez créer le tableau de la liste des super-type de classe. de sorte que vous pouvez le faire.
Oeil à cet exemple et choisir selon vos besoins