“Itérable<Element> ne peut pas être jeté à la Liste<Element>” - ce N'est pas de "Liste" un type " d'objet iterable`?
J'ai appelé un getElements
méthode qui renvoie la Iterable<Element>
.
Je l'ai fait:
List<Element> elements = (List<Element>) getElements();
Cela génère l'erreur:
java.lang.ClassCastException: com.utesy.Element$3
cannot be cast to java.util.List
J'ai pensé à une List
était un type de Iterable
?
poste le code de
Le
getElements();
méthodeLe
List
interface étend la Iterable
interface - si oui, List
est de type Iterable
, comme vous le dites. Mais cela ne signifie pas que, quelle que soit Iterable
est retourné par getElements
est aussi un List
. Toutes les Listes sont Iterables, mais pas tous Iterables sont des Listes.OriginalL'auteur snoopy | 2010-10-18
Vous devez vous connecter pour publier un commentaire.
Oui,
List<T>
s'étendIterable<T>
, mais cela ne signifie pas que vous pouvez lancer à partir de toutIterable<T>
àList<T>
- uniquement lorsque la valeur fait fait référence à une instance d'un type deList<T>
. Il est tout à fait possible de mettre en œuvreIterable<T>
sans mettre en œuvre le reste de laList<T>
interface... dans ce cas, qu'attendez-vous d'arriver?Pour simplifier, nous allons changer
Iterable<T>
àObject
etList<T>
àString
.String
s'étendObject
, de sorte que vous pouvez essayer sortsObject
àString
... mais le casting ne sera couronnée de succès au moment de l'exécution si la référence fait se réfère à unString
(ou null).OriginalL'auteur Jon Skeet
Vous pouvez activer l'objet iterable dans une Liste avec
C'est la plus concise façon de le faire. Sinon, vous aurez besoin d'un long temps de mise en œuvre 🙁 -- ou simplement l'utiliser Scala 😉
OriginalL'auteur dev_doctor
List<Element>
est un type deIterable<Element>
, mais cela ne signifie pas que tous lesIterable<Element>
objets sontList<Element>
objets. Vous pouvez jeter unList<Element>
comme unIterable<Element>
, mais pas l'inverse.Une pomme est un type de fruit, mais cela ne signifie pas que tous les fruits sont des pommes. Vous pouvez lancer une pomme comme des fruits, mais pas l'inverse.
OriginalL'auteur Erick Robertson
pourquoi pas:
?
besoins pas de google lib.
OriginalL'auteur Rei
Liste s'étend de la Collection qui s'étend Itératif. Vous donc en train de jeter un sous-type qui ne fonctionnent pas si getElements() retourne une Liste (dont la signature n'est pas en aucune façon la garantie).
Voir: http://download.oracle.com/javase/1.5.0/docs/api/java/util/List.html
OriginalL'auteur John Pickup
List
est un subinterface deIterable
ce qui signifie que la Liste comprend à peu près tout ce qui Itérable a, toutefois, pas l'inverse. Afin de ne pas toutes les méthodes d'une instance de Liste aurait un équivalent en Itératif.Essayer d'éviter ce genre de casting.
Je vous recommande de prendre un coup d'oeil à la 6 API Java et les tutoriels couvrant casting
OriginalL'auteur posdef
De message d'exception, il est clair que
Iterable<Element>
n'est pas moulage àList<Element>
SI vous avez besoin de retourner
List<Element>
degetElements()
OriginalL'auteur Jigar Joshi
Liste implémente l'objet iterable interface, mais cela ne veut pas dire Itératif peut être moulé retour à la Liste. Itérable est beaucoup plus générale et peut être de Hachage ou exotiques type qui n'a aucun rapport à la Liste. (Il ressemble à getElements() renvoie une instance de l'anonymat intérieur de la classe figurant aux côtés de getElements au sein de sa classe).
Si getElements arriverait-il à contenir des Listes alors ce serait un valides exprimés. Comme le type retourné par getElements() n'a pas fait une Liste de ce produit une erreur d'exécution.
Désolé, le "ne signifie pas qu'il peut être coulé" il n'était pas clair, j'ai rempli le "il"s ne peut donc pas être interprété à tort comme vous l'avez.
OriginalL'auteur Ash
Pas tous
Iterable
s sontList
s, donc il n'est pas sûr de jeter un arbitraireIterable
à unList
.Prendre toute
Set
par exemple, unHashSet
estIterable
mais les éléments n'a pas d'ordre, on ne peut pas mettre en œuvre laList
interface, et n'est donc pas unList
.<nit-pick>
"mais les éléments n'a pas d'ordre, il n'est donc pas unList
" - ce n'est pas la raison pour laquelle unHashSet
n'est pas unList
. UnHashSet
n'est pas unList
parce qu'il ne veut pas mettre en œuvre laList
interface.</nit-pick>
De la balle, c'est vrai... reformulé un peu... mieux? 🙂
OriginalL'auteur aioobe
vous pouvez essayer de placer un garde avec
instanceof
:OriginalL'auteur Adrian