编写自己的迭代器时类型不匹配

时间:2018-06-27 09:59:41

标签: java generics types iterator

我已经写了自己的LinkedList,因为我不想手动进行迭代,所以总是检查null。我以为我应该编写自己的Iterator方法来返回迭代器。

我的问题是,我真的不知道如何将List和Iterator链接在一起。我认为这是我的TypeMismatch问题的更深层原因。

public class SearchList<T extends Comparable<T>> implements List<T> {

    public class Node {
        T obj;
        Node next;
        int occurences;

        public Node() {
            this.obj = null;
            this.next = null;
            this.occurences = 1;
        }
    }

    private Node head;

    //Here are my List methods
}

这是迭代器方法

@Override
public Iterator<T> iterator() {

    Node current = head;

    Iterator<T> iterator = new Iterator<T>() {
        @Override
        public boolean hasNext() {
            return current.next != null;
        }

        @Override
        public T next() {
            return current.next;
        }
    };
    return iterator;
}

Intellij抱怨迭代器的重写next()方法中的类型不匹配。

那么我该如何正确实施呢?

1 个答案:

答案 0 :(得分:0)

current.next是另一个Node实例(下一个节点),而不是数据(T类型的数据)

将其更改为

@Override
public T next() {
    T data = current.obj;
    current = current.next;
    return data;
}

此外,您的hasNext条件检查current.next != null,因此您将无法访问最后一个元素。可能必须将其更改为current != null

此答案假设您需要Iterable<T>而不是Iterable<Node>

更新:

如果要遍历Node,则必须返回Iterator<Node>

@Override
public Iterator<Node> iterator() {

    Node current = head;

    Iterator<Node> iterator = new Iterator<>() {
        @Override
        public boolean hasNext() {
            return current!= null;
        }

        @Override
        public T next() {
            Node currentNode = current;
            current = current.next;
            return currentNode;
        }
    };
    return iterator;
}
相关问题