13

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

これは私がしました:

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

これにより、次のエラーが生成されます。

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

a は?Listのタイプだと思いました。Iterable

4

10 に答える 10

28

Iterable を List に変えることができます

List<Element> elements = Lists.newArrayList( getElements() );
于 2011-10-12T03:49:16.303 に答える
27

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

もっと簡単に言うと、 と に変更しIterable<T>ましょう。extendsであるため、 fromから...へのキャストを試みることができますが、参照が実際に a を参照している(または null である)場合にのみ、キャストが実行時に成功します。ObjectList<T>StringStringObjectObjectStringString

于 2010-10-18T14:01:21.897 に答える
18

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

りんごは果物の一種ですが、すべての果物がりんごというわけではありません。リンゴを果物としてキャストすることはできますが、その逆はできません。

于 2010-10-18T14:02:14.687 に答える
5

なぜだめですか:

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

? Google lib は必要ありません。

于 2011-12-17T04:37:24.277 に答える
2

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

参照: http://download.oracle.com/javase/1.5.0/docs/api/java/util/List.html

于 2010-10-18T14:02:01.517 に答える
1

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

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

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

于 2010-10-18T14:02:13.670 に答える
0

次の方法でガードを配置できますinstanceof

if (AnElement instanceof AList){
    //cast
    AList = (AnList)Element
}
于 2011-12-17T05:30:08.760 に答える
0

List は Iterable インターフェースを実装していますが、これは Iterable を List にキャストできるという意味ではありません。Iterable はより一般的であり、ハッシュまたは List とは関係のないエキゾチックな型である可能性があります。(getElements() は、クラス内の getElements と一緒に含まれる匿名の内部クラスのインスタンスを返すようです)。

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

于 2010-10-18T14:03:59.517 に答える
0

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

Setたとえば、 aHashSetは a ですが、要素には順序がないIterableため、Listインターフェイスを実装できず、 a ではありませんList

于 2010-10-18T14:00:35.313 に答える
0

例外メッセージから、キャストできないことは明らかです Iterable<Element> List<Element>

List<Element>SOから戻る必要がありますgetElements()

于 2010-10-18T14:01:19.770 に答える