【问题标题】:Flattening a list of lists - Conversion type mismatch展平列表列表 - 转换类型不匹配
【发布时间】:2013-06-10 14:20:00
【问题描述】:

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

错误是: 类型不匹配:无法从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
            }
        }
            //..
    }
}

【问题讨论】:

    标签: java list type-conversion


    【解决方案1】:

    您的代码中实际上有两个不同的类型参数。两者都称为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
                }
            }
            //..
        }
    }
    

    这会产生一个更有用的错误消息:

    类型不匹配:无法从 java.util.Iterator> 转换为 java.util.Iterator>

    解决办法是不要重新声明类型变量。由于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
                }
            }
            //..
        }
    }
    

    【讨论】:

      【解决方案2】:

      ListIterator 类中删除类型参数T 可以解决您的问题。即:

      class ListIterator implements Iterator<T> {
      

      尽管这两个类型参数被称为相同 (T),但它们实际上相同。这就是为什么您会收到如此令人困惑的消息:java.util.List&lt;List&lt;T&gt;&gt; cannot be cast to java.util.List&lt;List&lt;T&gt;&gt; 因为这两个 T 是,我再说一遍,不一样。

      这也可以解决:

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

      【讨论】:

        猜你喜欢
        • 2013-06-08
        • 1970-01-01
        • 1970-01-01
        • 2015-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-19
        相关资源
        最近更新 更多