链表迭代器内部类-java

时间:2014-10-15 15:15:08

标签: java linked-list iterator inner-classes

我正在编写一个遍历列表的迭代器内部类。除了remove方法之外,我相信我已经正确地实现了迭代器的所有方法,但是我得到一个错误说"绑定不匹配:类型E不是有界参数的有效替代> List.Node"的类型。我相信这必须与Node>在我的代码顶部实现Iterable,但如果不需要,我不想更改它。关于我应该做什么的任何可能的建议?

public class List<T extends Comparable<L>> implements Iterable<L> {

    private class Node<N extends Comparable<N>> {
        private N data;
        private Node<N> next;
    }
    protected Node<L> head;


    public Iterator<L> iterator() {

        return new ListIterator<L>();

    }

    public class ListIterator<E extends Comparable<E>> implements Iterator<E> {

        private Node<E> N = (Node<E>) head; //"Bound mismatch: The type E is not a valid substitute for the bounded parameter <D extends Comparable<D>> of the type List<T>.Node<D>"

        public boolean hasNext() {
            return (N.next != null);
        }

        public E next() {
            if (!hasNext())
                throw new NoSuchElementException();
            else {
                N = N.next;
                return N.data;
            }
        }

        public void remove() {

        }

    }
}

2 个答案:

答案 0 :(得分:2)

您应该减少泛型类型的数量。因为内部类知道其父类的泛型类型,所以应该简化Node和ListIterator类:

public class List<L extends Comparable<L>> implements Iterable<L> {
    private class Node {
        private L data;
        private Node next;
    }
    protected Node head;

    public Iterator<L> iterator() {

        return new ListIterator();

    }

    public class ListIterator implements Iterator<L> {

        private Node N = head;

        public boolean hasNext() {
            return (N.next != null);
        }

        public L next() {
            if (!hasNext())
                throw new NoSuchElementException();
            else {
                N = N.next;
                return N.data;
            }
        }

        public void remove() {

        }

    }
}

答案 1 :(得分:1)

类型参数N声明为

N extends Comparable<N>

即。它有界限。它必须是Comparable

类型参数E声明为

E

即。它没有界限。它可以是任何类型,但不一定是Comparable自身的类型。

因此,您无法在E预期使用N的情况下使用N。考虑将E添加到{{1}}的相同边界。