Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java &引用;Iterable<;元素>;无法强制转换到列表<;元素>"E;”Isn';t`List`是一种`Iterable`?_Java_List_Classcastexception_Iterable - Fatal编程技术网

Java &引用;Iterable<;元素>;无法强制转换到列表<;元素>"E;”Isn';t`List`是一种`Iterable`?

Java &引用;Iterable<;元素>;无法强制转换到列表<;元素>"E;”Isn';t`List`是一种`Iterable`?,java,list,classcastexception,iterable,Java,List,Classcastexception,Iterable,我调用了一个getElements方法,该方法返回Iterable 我这样做: List<Element> elements = (List<Element>) getElements(); 我认为列表是一种Iterable?并非所有Iterable都是列表,因此将任意Iterable强制转换为列表是不安全的 以任何Set为例,HashSet是Iterable,但元素没有顺序,因此它不能实现列表接口,因此它不是异常消息中的列表 Iterable不能对列表进行强制转换 因

我调用了一个
getElements
方法,该方法返回
Iterable

我这样做:

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

我认为
列表
是一种
Iterable
并非所有
Iterable
都是
列表
,因此将任意
Iterable
强制转换为
列表
是不安全的


以任何
Set
为例
HashSet
Iterable
,但元素没有顺序,因此它不能实现
列表
接口,因此它不是异常消息中的
列表
Iterable
不能对列表进行强制转换

因此,您需要从
getElements()
返回
List
,是的,
List
扩展了
Iterable
,但这并不意味着您可以从任何
Iterable
转换为
List
——仅当值实际引用
List
类型的实例时。完全可以实现
Iterable
,而无需实现
列表的其余部分
接口。。。在这种情况下,您希望发生什么


更简单地说,让我们将
Iterable
更改为
Object
,将
List
更改为
String
<代码>字符串扩展了
对象
,因此您可以尝试从
对象
转换为
字符串
。。。但是,只有当引用实际引用了
字符串(或为null)时,强制转换才会在执行时成功。

列表扩展集合,而集合又扩展了Iterable。因此,您试图强制转换到一个子类型,除非getElements()确实返回一个列表(签名无论如何都不能保证该列表),否则该子类型将不起作用

请参阅:

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

尽量避免那种类型的铸造

我建议您快速浏览一下,教程介绍了铸造

列表
是一种类型的
Iterable
,但这并不意味着所有
Iterable
对象都是
列表
对象。您可以将
列表
转换为
Iterable
,但不能反过来


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

列表实现了Iterable接口,但这并不意味着Iterable可以被扔回列表。Iterable更一般,可能是散列或一些与列表无关的外来类型。(看起来像getElements()返回某个匿名内部类的实例,该类包含在其类中的getElements旁边)


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

您可以使用

List<Element> elements = Lists.newArrayList( getElements() );
List elements=Lists.newArrayList(getElements());
为什么不:

    Iterable<Element> i = ...; //is what you have
    List<Element> myList = new LinkedList<Element>();
    for (Element e:i) {
        myList.add(e);
    }
Iterable i=//这就是你所拥有的
List myList=newlinkedlist();
对于(要素e:i){
添加(e);
}
??
不需要谷歌库。

您可以尝试使用
instanceof
放置一个防护:

if (AnElement instanceof AList){
    //cast
    AList = (AnList)Element
}

发布
getElements()的代码方法
List
接口扩展了
Iterable
接口-因此是的,
List
Iterable
类型,正如您所说。但这并不意味着
getElements
返回的
Iterable
也是一个
列表。所有列表都是可编辑列表,但并非所有的可编辑列表都是列表。
“但是元素没有顺序,所以它不是
列表
”-这不是
哈希集
不是
列表的原因。
HashSet
不是
List
,因为它没有实现
List
接口<代码>
@Matt Ball,真的。。。重新制定一点。。。更好?:)List实现了Iterable,这确实意味着可以将其强制转换为它。OP面临的问题正朝着另一个方向发展。这与它是一个实现还是一个扩展无关。很抱歉,“并不意味着它可以被强制转换它”不清楚,我已经填写了“它”,这样就不会被错误地解释为你所做的。这是最简洁的方法。否则,您将需要一个较长的实现:-(-或者只使用Scala;)
if (AnElement instanceof AList){
    //cast
    AList = (AnList)Element
}