【问题标题】:Java generics not returning the correct valueJava 泛型没有返回正确的值
【发布时间】:2014-03-12 22:16:43
【问题描述】:

我在 Java 中实现了一个双向链表,它实现了 Iterator 类。我有一个带有名为 DoublyLinkedListIterator 的内部类的 DoublyLinkedList 类,以帮助遍历列表。 (见下文)。

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

private class DoublyLinkedListIterator<E> implements Iterator<E> {
    private Node<E> current;

    private DoublyLinkedListIterator() {
        current = DoublyLinkedList.this.head;
    }

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

    public Node<E> next() {

        Node<E> ret = null;
        if (hasNext()) {
            ret = current;
            current = current.next();
            return ret;
        }
        else {
            throw new java.util.NoSuchElementException("No next element.");
        }
    }

    public void remove() {
        throw new UnsupportedOperationException("Can't remove");
    }
}

}

在上面,我试图通过创建迭代器的实例来获取下一个值,就像这样......

current = iterator.next();

(current 是 Node 类型)

由于某种原因,我不断收到此错误:

DoublyLinkedList.java:62: error: incompatible types
            current = iterator.next();
                                   ^


required: Node<T>
  found:    T
  where T is a type-variable:
    T extends Object declared in class DoublyLinkedList

有什么想法吗?

【问题讨论】:

  • 如果你实现Iterator&lt;E&gt;,你必须提供一个返回Enext()。我只看到一个返回Node&lt;E&gt;next()
  • 显示的代码中不包含错误中的行。

标签: java generics iterator linked-list iterable


【解决方案1】:

Iterator 接口定义为

public interface Iterator<E> {
    [...]

    E next();

    [...]
}

你正在使用它

private class DoublyLinkedListIterator<E> implements Iterator<E> {

但试图将其实现为

public Node<E> next() {

您不应该返回 Node&lt;E&gt;,而应该返回 E

【讨论】:

  • 要么,要么他应该实现Iterator&lt;Node&lt;E&gt;&gt;,这取决于他想要什么。
  • @ajb 对。我会说,链表很少能揭示其内部结构。
  • 所以我正在尝试分配Node&lt;T&gt; current= iterator.next();,但仍然遇到同样的错误。 next() 返回的泛型类型不应该是节点吗?
  • @user1493543 next()的返回类型是E。您将什么用作类型参数E 的类型参数?你用过E,所以不能是Node&lt;E&gt;
【解决方案2】:

Iterator&lt;E&gt; 包含一个方法E next()。你还没有声明这样的方法;你声明了Node&lt;E&gt; next()

尝试为E 插入一个具体类型,如果这样更容易的话。想象一下你有一个Iterator&lt;String&gt;。你不希望next() 返回String,而不是Node&lt;String&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    相关资源
    最近更新 更多