我打电话给 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>ObjectList<T>String. String 扩展 Object, , 这样你就可以 尝试ObjectString...但是,如果参考 实际上 指的是 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()返回的类型实际上不是列表,因此会产生运行时错误。

不是全部 IterableS是 Lists,因此派出任意是不安全的 IterableList.

采取任何 Set 例如, , 一个 HashSetIterable 但是这些元素没有顺序,因此它无法实施 List 接口,因此不是 List.

您可以尝试与 instanceof:

if (AnElement instanceof AList){
    //cast
    AList = (AnList)Element
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top