「iterable をリストするためにキャストできません」 - `list`は「iterable」のタイプではありませんか?

StackOverflow https://stackoverflow.com/questions/3959892

質問

私は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>ObjectList<T>String. String 拡張 Object, 、 だからあなたはできる 試す キャストする ObjectString...しかし、キャストは参照の場合にのみ実行時に成功します 実際に を指します 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()によって返されたタイプが実際にはリストではなかったため、これにより実行時間エラーが生成されます。

すべてではない Iterablesです Lists、したがって、任意をキャストすることは安全ではありません IterableList.

何かを取る Set 例えば, 、a HashSetIterable しかし、要素には順序がないので、実装できません List インターフェイス、したがって、そうではありません List.

あなたは警備員を配置しようとすることができます instanceof:

if (AnElement instanceof AList){
    //cast
    AList = (AnList)Element
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top