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
}