【问题标题】:Type mismatch when writing my own iterator编写自己的迭代器时类型不匹配
【发布时间】:2018-06-27 09:59:41
【问题描述】:

我已经编写了自己的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() 方法中的类型不匹配。

那么我该如何以正确的方式实现呢?

【问题讨论】:

  • current.nextNode,而不是 T。应该是current.next.obj。如果您希望迭代器实际遍历列表,还需要将current 设置为下一个节点。

标签: java generics types iterator


【解决方案1】:

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

改成

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

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

此答案假定您需要 Iterable&lt;T&gt; 而不是 Iterable&lt;Node&gt;

更新:

如果你想遍历Node,那么你必须返回Iterator&lt;Node&gt;

@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;
}

【讨论】:

  • 我认为next() 应该返回Node 而不是模板T
  • @Michel_T。我以为 OP 想要一个 Iterable&lt;T&gt;
  • @Michel_T。我在 OP 中没有看到 implements Iterable...。那么,您认为Iterator 的类型是什么? (我想我们只是在猜测 OP 想要什么)。在其他情况下,您想迭代什么?节点?单个数据元素(我认为是后者)
  • 好吧,如果您要实现自己的列表,为什么不迭代节点呢?但是每个节点都必须有next()方法。
  • @freedeebee,不应该是 List 而不是 SList 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-22
  • 2015-05-26
  • 2015-06-17
  • 2011-02-09
  • 1970-01-01
相关资源
最近更新 更多