java - 展平列表列表 - 转换类型不匹配

标签 java list type-conversion

我正在实现一个迭代器来展平列表列表,但它给了我一个错误,我无法理解为什么会发生这种情况:

错误是: 类型不匹配:无法从 java.util.Iterator<java.util.List<T>> 转换至java.util.Iterator<java.util.List<T>>

我很困惑,为什么它尝试将类型转换为自身?为什么它没有成功?是因为它在内部类中使用吗?

public class FlattenList<T> implements Iterable<T>{
    private List<List<T>> lists;
    public FlattenList(List<List<T>> list){
        this.lists = list;
    }
    public Iterator<T> iterator(){
        return new ListIterator();
    }
    class ListIterator<T> implements Iterator<T>{
        private Iterator<List<T>> listsiterator;
        private Iterator<T> listiterator;
        public ListIterator(){
            if (lists != null)
                listsiterator = lists.iterator(); // The conversion mismatch here
            }
        }
            //..
    }
}

最佳答案

您的代码中实际上有两种不同类型的参数。两者都称为T,因此内部的一个会遮蔽外部的。但它们绝对不一样。您的代码相当于:

public class FlattenList<T> implements Iterable<T>{
    private List<List<T>> lists;
    public FlattenList(List<List<T>> list){
        this.lists = list;
    }
    public Iterator<T> iterator(){
        return new ListIterator();
    }
    class ListIterator<E> implements Iterator<E>{
        private Iterator<List<E>> listsiterator;
        private Iterator<E> listiterator;
        public ListIterator(){
            if (lists != null) {
                listsiterator = lists.iterator(); // The conversion mismatch here
            }
        }
        //..
    }
}

它会产生稍微有用的错误消息:

Type mismatch: cannot convert from java.util.Iterator<java.util.List<T>> to java.util.Iterator<java.util.List<E>>

解决方案是不要重新声明类型变量。由于 ListIterator 是一个内部类,因此它可以访问包含实例的 T:

public class FlattenList<T> implements Iterable<T>{
    private List<List<T>> lists;
    public FlattenList(List<List<T>> list){
        this.lists = list;
    }
    public Iterator<T> iterator(){
        return new ListIterator();
    }
    class ListIterator implements Iterator<T>{
        private Iterator<List<T>> listsiterator;
        private Iterator<T> listiterator;
        public ListIterator(){
            if (lists != null) {
                listsiterator = lists.iterator(); // The conversion mismatch here
            }
        }
        //..
    }
}

关于java - 展平列表列表 - 转换类型不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17099920/

相关文章:

c++ - 为什么在完美转发中不允许隐式转换?

java - 在 Java 中创建、搜索和修改(key、value1、value2)的最佳方式

java - 在 Java 中反转文件(图像、音乐)会损坏文件

python - 如果该子列表的任何元素在另一个列表中,如何删除列表(即子列表)中的列表?

Python:附加到存储在搁置字典中的实例所拥有的列表

javascript - 在javascript中将字符串更改为数字

java - List<byte[]> 到单字节[]

java - 使用 Hadoop MapReduce 从 CSV 文件中收集特定数据

python - 列表中最大的 n 个元素的项目和索引

C++ Uint8 数据类型转换为 const char* 数据类型