我调用了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
?
答案 0 :(得分:25)
您可以使用
将Iterable转换为ListList<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>
更改为String
。 String
扩展了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)
List
是Iterable
的子接口,这意味着List几乎包含了Iterable的所有内容,但不是相反。因此,并非List实例中的所有方法都具有Iterable中的等效项。
尽量避免那种投射。
我建议您快速查看Java 6 API和有关投射的教程
答案 6 :(得分:0)
并非所有Iterable
都是List
s,因此将Iterable
转换为List
是不安全的。
取任何Set
为实例,HashSet
为Iterable
但元素没有订单,因此无法实现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
}