"Iterable <Element>无法强制转换为List <Element>" - 不是`List`是一种`Iterable`吗?

sno*_*opy 11 java iterable list classcastexception

我打电话给一个getElements返回的方法Iterable<Element>.

我这样做了:

List<Element> elements = (List<Element>) getElements();
Run Code Online (Sandbox Code Playgroud)

这会生成错误:

java.lang.ClassCastException: com.utesy.Element$3 
cannot be cast to java.util.List
Run Code Online (Sandbox Code Playgroud)

我以为List是一种Iterable

Jon*_*eet 26

是的,List<T>扩展Iterable<T>,但这并不意味着您可以从任何转换 Iterable<T>List<T>- 仅当值实际引用某种类型的实例时List<T>.完全可以在Iterable<T>不实现List<T>接口的其余部分的情况下实现......在这种情况下,您期望会发生什么?

说得简单一点,让我们改变Iterable<T>ObjectList<T>String.Stringextends Object,所以你可以尝试转换ObjectString...但是只有在引用实际引用a String(或为null)时,转换才会在执行时成功.


dev*_*tor 26

您可以将Iterable转换为List

List<Element> elements = Lists.newArrayList( getElements() );
Run Code Online (Sandbox Code Playgroud)

  • ...列表是com.google.common.collect.Lists. (16认同)

Eri*_*son 18

List<Element>是一种类型Iterable<Element>,但这并不意味着所有Iterable<Element>对象都是List<Element>对象.你可以投出List<Element>作为Iterable<Element>,而不是周围的其他方式.

苹果是一种水果,但这并不意味着所有的水果都是苹果.你可以将苹果作为水果,但不是相反.


小智 5

为什么不:

    Iterable<Element> i = ...; //is what you have
    List<Element> myList = new LinkedList<Element>();
    for (Element e:i) {
        myList.add(e);
    }
Run Code Online (Sandbox Code Playgroud)

?不需要google lib.