“ Itable 不能被施放到列表” - ``列表''list'类型'iToble'?
-
08-10-2019 - |
题
我打电话给 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
?
解决方案
是的, 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
(或无效)。
其他提示
您可以将ITBOTS变成一个列表
List<Element> elements = Lists.newArrayList( getElements() );
List<Element>
是一种 Iterable<Element>
, ,但这并不意味着全部 Iterable<Element>
对象是 List<Element>
对象。你可以施放 List<Element>
作为一个 Iterable<Element>
, ,但不是相反。
苹果是一种水果,但这并不意味着所有水果都是苹果。您可以将苹果作为水果施放,但反之亦然。
为什么不:
Iterable<Element> i = ...; //is what you have
List<Element> myList = new LinkedList<Element>();
for (Element e:i) {
myList.add(e);
}
?不需要Google Lib。
列表扩展了集合,这又扩展了具有疑问。因此,您试图铸造一个子类型,除非GetElements()确实返回列表(签名并不能以任何方式保证该列表)。
看: http://download.oracle.com/javase/1.5.0/docs/api/java/java/util/list.html
List
是一个 子接口 的 Iterable
含义该列表几乎包含了山上的所有内容,但是不是相反。因此,并非列表实例中的所有方法都具有等效性。
尝试避免这种铸造。
我建议您快速看一下 Java 6 API 和涵盖铸造的教程
从异常消息可以明显看出Iterable<Element>
不可铸造 List<Element>
所以你需要返回 List<Element>
从 getElements()
列表实现了具有峰值的接口,但这并不意味着可以将其投入到列表中。它更一般性,可能是哈希或一些与列表无关的异国情调类型。 (看起来像getElements()返回了与getelements一起包含的某些匿名内部类的实例)。
如果Getelement将碰巧包含列表,那么这将是有效的演员。由于GetElements()返回的类型实际上不是列表,因此会产生运行时错误。
不是全部 Iterable
S是 List
s,因此派出任意是不安全的 Iterable
到 List
.
采取任何 Set
例如, , 一个 HashSet
是 Iterable
但是这些元素没有顺序,因此它无法实施 List
接口,因此不是 List
.
您可以尝试与 instanceof
:
if (AnElement instanceof AList){
//cast
AList = (AnList)Element
}