“Iterable <element>不能转换为List <element>” - 不是`List`是一种`Iterable`?</element> </element>

时间:2010-10-18 13:55:55

标签: java list classcastexception iterable

我调用了getElements方法,该方法返回Iterable<Element>

我这样做了:

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

这会产生错误:

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

我认为List是一种Iterable

10 个答案:

答案 0 :(得分:25)

您可以使用

将Iterable转换为List
List<Element> elements = Lists.newArrayList( getElements() );

答案 1 :(得分:24)

是的,List<T>延伸Iterable<T>,但这并不意味着您可以从任何 Iterable<T>投射到List<T> - 仅限于值实际指的是List<T>类型的实例。在没有实现Iterable<T>接口的其余部分的情况下实现List<T>是完全可能的......在这种情况下,您期望发生什么?

换句话说,让我们将Iterable<T>更改为Object,将List<T>更改为StringString扩展了Object,因此您可以尝试Object投射到String ...但是演员只有在执行时才会成功引用实际引用String(或为空)。

答案 2 :(得分:17)

List<Element>是一种Iterable<Element>,但这并不意味着所有Iterable<Element>个对象都是List<Element>个对象。您可以将List<Element>转换为Iterable<Element>,但不能反过来。

苹果是一种水果,但这并不意味着所有的水果都是苹果。你可以把苹果当作水果,但不是相反。

答案 3 :(得分:5)

为什么不:

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

? 不需要google lib。

答案 4 :(得分:2)

List extends Collection,后者又扩展了Iterable。因此,您试图转换为无法工作的子类型,除非getElements()确实返回一个List(签名不以任何方式保证)。

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

答案 5 :(得分:1)

ListIterable子接口,这意味着List几乎包含了Iterable的所有内容,但不是相反。因此,并非List实例中的所有方法都具有Iterable中的等效项。

尽量避免那种投射。

我建议您快速查看Java 6 API和有关投射的教程

答案 6 :(得分:0)

并非所有Iterable都是List s,因此将Iterable转换为List是不安全的。

取任何Set为实例HashSetIterable但元素没有订单,因此无法实现List } interface,因此不是List

答案 7 :(得分:0)

从异常消息中可以清楚地看到 Iterable<Element> 无法投放到 List<Element>

所以你需要从List<Element>

返回getElements()

答案 8 :(得分:0)

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

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

答案 9 :(得分:0)

您可以尝试使用instanceof

放置一名警卫
if (AnElement instanceof AList){
    //cast
    AList = (AnList)Element
}