13

我调用了一个getElements返回的方法Iterable<Element>

我这样做了:

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

这会产生错误:

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

我以为 aList是一种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>Object和。extends ,因此您可以尝试将 from转换为... 但如果引用实际上引用 a (或为 null),则转换只会在执行时成功。List<T>StringStringObjectObjectStringString

于 2010-10-18T14:01:21.897 回答
18

List<Element>是 的一种Iterable<Element>,但这并不意味着所有Iterable<Element>对象都是List<Element>对象。您可以将 a 转换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);
    }

? 不需要谷歌库。

于 2011-12-17T04:37:24.277 回答
2

List 扩展了 Collection,后者又扩展了 Iterable。因此,您尝试强制转换为一个子类型,除非 getElements() 真的返回一个 List (签名不以任何方式保证),否则该子类型将不起作用。

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

于 2010-10-18T14:02:01.517 回答
1

List是意义的子接口IterableList 几乎包含了 Iterable 所拥有的所有东西,但反之则不然。因此,并非 List 实例中的所有方法在 Iterable 中都具有等价物。

尽量避免这种类型的铸造。

我建议您快速浏览一下Java 6 API和有关强制转换的教程

于 2010-10-18T14:02:13.670 回答
0

并非所有Iterables 都是s,因此将任意值强制转换为 a 是List不安全的。IterableList

以 anySet为例,aHashSetIterable但元素没有顺序,所以它不能实现List接口,因此不是 a List

于 2010-10-18T14:00:35.313 回答
0

从异常消息中可以清楚地看出, Iterable<Element> 它不能转换为 List<Element>

所以你需要List<Element>getElements()

于 2010-10-18T14:01:19.770 回答
0

List 实现了 Iterable 接口,但这并不意味着 Iterable 可以被强制转换回 List。Iterable 更为通用,可能是 Hash 或某种与 List 无关的奇异类型。(看起来 getElements() 返回某个匿名内部类的实例,该类包含在其类中的 getElements 旁边)。

如果 getElements 碰巧包含列表,那么这将是一个有效的强制转换。由于 getElements() 返回的类型实际上不是 List 这会产生运行时错误。

于 2010-10-18T14:03:59.517 回答
0

您可以尝试使用以下方式设置警卫instanceof

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