2

リストのリストを平坦化するイテレータを実装していますが、なぜそれが起こるのか理解できないエラーが発生します:

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
            }
        }
            //..
    }
}
4

2 に答える 2

2

コードには、実際には 2 つの異なる型パラメーターがあります。両方とも と呼ばれる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.List<T>> から 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
            }
        }
        //..
    }
}
于 2013-06-14T02:02:48.867 に答える
1

クラスTから型パラメーターを削除すると、問題が解決します。ListIteratorすなわち:

class ListIterator implements Iterator<T> {

これら 2 つの型引数は同じ ( T) と呼ばれますが、実際には同じではありません。そのため、非常に紛らわしいメッセージが表示されます。java.util.List<List<T>> cannot be cast to java.util.List<List<T>>これらの 2 つの 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-14T01:59:49.400 に答える