2010-10-18 57 views
9

我叫了getElements方法返回Iterable<Element>「可迭代<Element>不能轉換到列表<Element>」 - 是不是`List`類型`Iterable`的?

我這樣做:

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

這會產生錯誤:

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

我想到了一個List是一個類型的Iterable

+1

發佈的'的getElements()的代碼;'方法 – 2010-10-18 13:58:09

+1

的'List'接口擴展了'Iterable'接口 - 所以是的,'List'就像你說的那樣,類型是'Iterable'。但這並不意味着'getElements'返回的'Iterable'也是'List'。所有列表都是可打斷的,但並非所有的可打印列表都是列表。 – 2010-10-18 14:01:01

回答

24

是返回List<Element>List<T>延伸Iterable<T>,但這並不意味着你可以從任何Iterable<T>List<T>投 - 只有當值實際上是指的一個實例類型爲List<T>。這是完全可能實現Iterable<T>沒有實現List<T>接口的休息...在這種情況下,你會期待發生什麼呢?

簡而言之,讓我們將Iterable<T>更改爲ObjectList<T>StringString延伸Object,所以你可以嘗試Object轉換爲String ...但如果參考實際上String(或爲空),中投將只在執行時取得成功。

0

並非所有Iterable s爲List S,因而它不是安全投任意IterableList

採取任何Set例如,一個HashSetIterable但是元素沒有順序,因此它無法實現List接口,因此是不是List

+2

''「但元素沒有順序,所以它不是'List'」 - 這不是'HashSet'不是'List'的原因。 'HashSet'不是'List',因爲它沒有實現'List'接口。 '' – 2010-10-18 14:03:46

+0

@Matt Ball,真的......重新表達了一下......更好? :) – aioobe 2010-10-18 14:26:49

0

從異常消息顯然 Iterable<Element>不強制轉換爲List<Element>

,所以你需要從getElements()

1

List子接口Iterable含義列表中包括了可迭代有幾乎一切,但不是周圍的其他方式。因此,不是List實例中的所有方法在Iterable中都有相同的方法。

儘量避免那種鑄造的。

我會建議你採取快速瀏覽一下Java 6 API和覆蓋鑄造

17

List<Element>是一種類型的Iterable<Element>的教程,但是,這並不意味着所有Iterable<Element>對象是List<Element>對象。您可以投List<Element>作爲Iterable<Element>,但不是相反。

蘋果是一種水果,但這並不意味着所有的水果都是蘋果。你可以把蘋果當成水果,但不能反過來。

+13

+1沒有229k代表 – willcodejavaforfood 2010-10-18 14:06:43

0

List實現Iterable接口,但這並不意味着Iterable可以轉換回List。 Iterable更通用,可能是Hash或一些與List沒有任何關係的外來類型。 (它看起來像getElements()返回一個匿名內部類的實例,它與類中的getElements一起包含)。

如果getElements會碰巧包含Lists,那麼這將是一個有效的強制轉換。由於getElements()返回的類型實際上不是List,所以會產生運行時錯誤。

+0

列表實現了Iterable,並且這個*確實意味着它可以投射到它。 OP所面臨的問題正在以另一種方式發生。這與它是一個實現還是擴展無關。 – 2010-10-18 14:11:33

+0

對不起,「不代表它可以投它」不清楚,我已經填寫了「它」,所以它不能被錯誤地解釋,因爲你有。 – AshirusNW 2010-10-18 14:15:34

24

你可以把可迭代成一個列表與

List<Element> elements = Lists.newArrayList(getElements()); 
+13

...其中Lists是com.google.common.collect.Lists。 – jarnoan 2011-10-14 09:33:17

+0

這是最簡潔的方法。否則,你需要一個很長的實現:-( - 或者只是使用Scala;) – 2011-11-04 20:05:18

4

爲什麼不:

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

? 不需要谷歌圖書館。

+0

到目前爲止最簡單的方法... – 2017-07-13 09:53:59

0

,你可以嘗試把與instanceof保護:

if (AnElement instanceof AList){ 
    //cast 
    AList = (AnList)Element 
} 
相關問題