使用Java泛型类型编译错误

时间:2012-03-22 01:56:22

标签: java iterator inner-classes doubly-linked-list

我正在进行学习练习,并使用迭代器创建自己的链表。课程如下:

public class LinkedList<T> implements Iterable <T> {
    private Node<T> head;
    private Node<T> tail;
    private int size;

    public LinkedList() {
        head = new Node<T>();
        tail = new Node<T>();
        head.setNext(tail);  
        tail.setPrevious(head);
        size = 0;
    }

    public void append(T element) {
        tail.getPrevious().setNext(new Node<T>(element));
        tail.getPrevious().getNext().setNext(tail);
        tail.getPrevious().getNext().setPrevious(tail.getPrevious());
        tail.setPrevious(tail.getPrevious().getNext()); 
        size++;
    }

    public void prepend(T element) {
        head.getNext().setPrevious(new Node<T>(element));
        head.getNext().getPrevious().setPrevious(head);
        head.getNext().getPrevious().setNext(head.getNext());
        head.setNext(head.getNext().getPrevious());
        size++;
    }

    public void remove(Node<T> nodeToRemove) {
        if(!isEmpty()) {
            nodeToRemove.getPrevious().setNext(nodeToRemove.getNext());
            nodeToRemove.getNext().setPrevious(nodeToRemove.getPrevious());
            nodeToRemove.setNext(null);
            nodeToRemove.setPrevious(null);
            nodeToRemove.setElement(null);
            nodeToRemove = null;
            size--;
        }
    }


    public boolean isEmpty() {
        return size() == 0;
    }

    public int size() {
        return size;
    }   

    public Iterator<T> iterator() {
        return new Cursor<T>(head);
    }

    public String toString() {
        String result = "";

        for(T t : this) {
            result += t.toString() + "\n";
        }

        return result;
    }

    private final class Cursor<E> implements Iterator<E> {
        private Node<E> current;

        public <E> Cursor(Node<E> head) {
            this.current = current;
        }

        public boolean hasNext() {
            return current.getNext().getNext() != null;
        }

        public E next() {
            current = current.getNext();

            return current.getElement();
        }

        public void remove() {
            remove(current);
        }
    }
}

经过相当多的研究后,实现迭代器的一个好方法是将其作为一个内在的类。但是,我在游标类中使用remove方法收到编译错误。我认为这是因为类型不匹配,但我在remove()中得到的错误LinkedList<T>.Cursor<E>无法应用于<Node<E>)。

我已经和它搏斗了很长一段时间,我无法理解究竟是什么错误,我很感激您的任何见解。

1 个答案:

答案 0 :(得分:2)

有一些问题:

  1. 您有两种名为remove的方法。 Java认为你试图在内部remove类中调用Cursor,它不带参数。你必须像这样限定参考资料:

    LinkedList.this.remove(current);

  2. 您的内部游标类是非静态的。非静态内部类与创建它们的外部类实例相关联。基本上,它们维护一个指向外部类对象的父指针。这对于实现迭代器是正确的,但您需要更改使用泛型的方式。非静态内部类可以使用其父类的类型参数。这意味着您可以将迭代器定义更改为:

    private final class Cursor implements Iterator<T>

    它将自动使用<T>中的LinkedList

  3. this.current = current;应该是this.current = head;

  4. 为什么hasNext两次致电getNext()
  5. 希望有所帮助。