「iterable はをリストするためにキャストできません」 - `list`は「iterable」のタイプではありませんか?
-
08-10-2019 - |
質問
私はaに電話しました getElements
返す方法 Iterable<Element>
.
これは私がしました:
List<Element> elements = (List<Element>) getElements();
これにより、エラーが生成されます。
java.lang.ClassCastException: com.utesy.Element$3
cannot be cast to java.util.List
私は考えました List
一種でした Iterable
?
解決
はい、 List<T>
拡張 Iterable<T>
, 、しかし、それはあなたがからキャストできるという意味ではありません どれか Iterable<T>
に List<T>
- 値が場合にのみ 実際に タイプのインスタンスを指します List<T>
. 。実装することは完全に可能です Iterable<T>
残りの部分を実装せずに List<T>
インターフェース...その場合、あなたは何が起こると思いますか?
簡単に言えば、変更しましょう Iterable<T>
に Object
と List<T>
に String
. String
拡張 Object
, 、 だからあなたはできる 試す キャストする Object
に String
...しかし、キャストは参照の場合にのみ実行時に成功します 実際に を指します String
(またはnull)。
他のヒント
Iterableをリストに変えることができます
List<Element> elements = Lists.newArrayList( getElements() );
List<Element>
タイプのものです Iterable<Element>
, 、しかし、それはすべてを意味しません Iterable<Element>
オブジェクトはです List<Element>
オブジェクト。キャストできます List<Element>
として Iterable<Element>
, 、しかし、逆ではありません。
リンゴは果物の一種ですが、それはすべての果物がリンゴであるという意味ではありません。リンゴを果物として鋳造することはできますが、その逆ではありません。
なぜだめですか:
Iterable<Element> i = ...; //is what you have
List<Element> myList = new LinkedList<Element>();
for (Element e:i) {
myList.add(e);
}
? Google Libは必要ありません。
リストはコレクションを拡張し、繰り返し可能になります。したがって、getElements()が実際にリストを返していない限り、機能しないサブタイプにキャストしようとしています(署名は決して保証しません)。
見る: http://download.oracle.com/javase/1.5.0/docs/api/java/util/list.html
List
aです サブインターフェイス の Iterable
そのリストには、反復可能なほとんどすべてのものが含まれていますが、その逆ではありません。したがって、リストインスタンスのすべてのメソッドが、反復可能な同等のものであるわけではありません。
そのようなキャストを避けるようにしてください。
私はあなたにあなたがあなたに Java 6 API キャスティングをカバーするチュートリアル
例外メッセージからそれは明らかですIterable<Element>
に鋳造できません List<Element>
だからあなたは戻る必要があります List<Element>
から getElements()
リストは反復可能なインターフェイスを実装しますが、これは反復可能をリストに戻すことができるという意味ではありません。反復性ははるかに一般的であり、ハッシュまたはリストとの関係がないエキゾチックなタイプである可能性があります。 (getElements()は、クラス内のgetelementsに沿って含まれる匿名の内部クラスのインスタンスを返しているようです)。
GetElementsがたまたまリストが含まれている場合、これは有効なキャストになります。 getElements()によって返されたタイプが実際にはリストではなかったため、これにより実行時間エラーが生成されます。
すべてではない Iterable
sです List
s、したがって、任意をキャストすることは安全ではありません Iterable
に List
.
何かを取る Set
例えば, 、a HashSet
は Iterable
しかし、要素には順序がないので、実装できません List
インターフェイス、したがって、そうではありません List
.
あなたは警備員を配置しようとすることができます instanceof
:
if (AnElement instanceof AList){
//cast
AList = (AnList)Element
}