Iterable<Element>
を返すgetElements
メソッドを呼び出しました。
これは私がしました:
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>
を拡張しますが、それはanyIterable<T>
からList<T>
にキャストできるという意味ではありません-値が-の場合のみ実際にははList<T>
のタイプのインスタンスを指します。残りのIterable<T>
インターフェースを実装せずにList<T>
を実装することは完全に可能です...その場合、何が起こると思いますか?
簡単に言うと、Iterable<T>
をObject
に、List<T>
をString
に変更しましょう。 String
はObject
を拡張するので、tryObject
からString
...にキャストできますが、キャストは成功するだけです参照実際にはがString
を参照している(またはnullである)場合、実行時に。
Iterableをリストに変えることができます
List<Element> elements = Lists.newArrayList( getElements() );
List<Element>
はIterable<Element>
の一種ですが、それはすべてのIterable<Element>
オブジェクトがList<Element>
オブジェクトであることを意味するわけではありません。 List<Element>
をIterable<Element>
としてキャストできますが、その逆はできません。
Appleは果物の一種ですが、すべての果物がリンゴであるとは限りません。Appleを果物としてキャストできますが、逆に。
何故なの:
Iterable<Element> i = ...; //is what you have
List<Element> myList = new LinkedList<Element>();
for (Element e:i) {
myList.add(e);
}
?グーグルライブラリは必要ありません。
ListはCollectionを拡張し、CollectionはIterableを拡張します。したがって、getElements()が実際にリストを返さない限り機能しないサブタイプにキャストしようとしています(署名は決して保証しません)。
参照: http://download.Oracle.com/javase/1.5.0/docs/api/Java/util/List.html
List
はIterable
のサブインターフェースです。つまり、Listには、Iterableが持つほとんどすべてのものが含まれますが、その逆はありません。周り。したがって、ListインスタンスのすべてのメソッドがIterableで同等のものを持つわけではありません。
そのようなキャストは避けてください。
Java 6 API とキャストに関するチュートリアルをざっと見てみることをお勧めします。
instanceof
でガードを配置してみることができます。
if (AnElement instanceof AList){
//cast
AList = (AnList)Element
}
すべてのIterable
sがList
sであるとは限らないため、任意のIterable
をList
にキャストすることは安全ではありません。
たとえばSet
を例にとると、HashSet
はIterable
ですが、要素に順序がないため、List
インターフェースであるため、List
ではありません。
例外メッセージから、_Iterable<Element>
_ キャスト不可 _List<Element>
_であることが明らかです。
したがって、getElements()
から_List<Element>
_を返す必要があります
ListはIterableインターフェースを実装していますが、これはIterableをListにキャストバックできるという意味ではありません。 Iterableははるかに一般的であり、HashまたはListとは関係のないエキゾチックなタイプの場合があります。 (getElements()は、そのクラス内のgetElementsと一緒に含まれている匿名の内部クラスのインスタンスを返すように見えます)。
GetElementsにリストが含まれている場合、これは有効なキャストになります。 getElements()によって返される型は実際にはリストではなかったため、これにより実行時エラーが発生します。