web-dev-qa-db-ja.com

「Iterable <Element>をList <Element>にキャストできません」-`List`は `Iterable`の一種ではありませんか?

Iterable<Element>を返すgetElementsメソッドを呼び出しました。

これは私がしました:

List<Element> elements = (List<Element>) getElements();

これにより、エラーが発生します。

Java.lang.ClassCastException: com.utesy.Element$3 
cannot be cast to Java.util.List

ListIterableの一種だと思いましたか?

11
snoopy

はい、List<T>Iterable<T>を拡張しますが、それはanyIterable<T>からList<T>にキャストできるという意味ではありません-値が-の場合のみ実際にはList<T>のタイプのインスタンスを指します。残りのIterable<T>インターフェースを実装せずにList<T>を実装することは完全に可能です...その場合、何が起こると思いますか?

簡単に言うと、Iterable<T>Objectに、List<T>Stringに変更しましょう。 StringObjectを拡張するので、tryObjectからString...にキャストできますが、キャストは成功するだけです参照実際にはStringを参照している(またはnullである)場合、実行時に。

26
Jon Skeet

Iterableをリストに変えることができます

List<Element> elements = Lists.newArrayList( getElements() );
26
dev_doctor

List<Element>Iterable<Element>の一種ですが、それはすべてのIterable<Element>オブジェクトがList<Element>オブジェクトであることを意味するわけではありません。 List<Element>Iterable<Element>としてキャストできますが、その逆はできません。

Appleは果物の一種ですが、すべての果物がリンゴであるとは限りません。Appleを果物としてキャストできますが、逆に。

18
Erick Robertson

何故なの:

    Iterable<Element> i = ...; //is what you have
    List<Element> myList = new LinkedList<Element>();
    for (Element e:i) {
        myList.add(e);
    }

?グーグルライブラリは必要ありません。

5
Rei

ListはCollectionを拡張し、CollectionはIterableを拡張します。したがって、getElements()が実際にリストを返さない限り機能しないサブタイプにキャストしようとしています(署名は決して保証しません)。

参照: http://download.Oracle.com/javase/1.5.0/docs/api/Java/util/List.html

2
John Pickup

ListIterableサブインターフェースです。つまり、Listには、Iterableが持つほとんどすべてのものが含まれますが、その逆はありません。周り。したがって、ListインスタンスのすべてのメソッドがIterableで同等のものを持つわけではありません。

そのようなキャストは避けてください。

Java 6 API とキャストに関するチュートリアルをざっと見てみることをお勧めします。

1
posdef

instanceofでガードを配置してみることができます。

if (AnElement instanceof AList){
    //cast
    AList = (AnList)Element
}
0
Adrian

すべてのIterablesがListsであるとは限らないため、任意のIterableListにキャストすることは安全ではありません。

たとえばSetを例にとるとHashSetIterableですが、要素に順序がないため、Listインターフェースであるため、Listではありません。

0
aioobe

例外メッセージから、_Iterable<Element>_ キャスト不可 _List<Element>_であることが明らかです。

したがって、getElements()から_List<Element>_を返す必要があります

0
Jigar Joshi

ListはIterableインターフェースを実装していますが、これはIterableをListにキャストバックできるという意味ではありません。 Iterableははるかに一般的であり、HashまたはListとは関係のないエキゾチックなタイプの場合があります。 (getElements()は、そのクラス内のgetElementsと一緒に含まれている匿名の内部クラスのインスタンスを返すように見えます)。

GetElementsにリストが含まれている場合、これは有効なキャストになります。 getElements()によって返される型は実際にはリストではなかったため、これにより実行時エラーが発生します。

0
Ash