有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

迭代器在Java中重写Iterables<Obj>的正确方法

这是我为实现链表而编写的代码

private class DequeIterator<Item> implements Iterable<Item> {
    private Node pElement;

    DequeIterator() {
        pElement = first;
    }

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

    public Item next() {
        if (!this.hasNext()) {
            throw new NoSuchElementException();
        }
        Item ret = pElement.it;
        pElement = pElement.next;
        return ret;
    }

    public void remove() {
        throw new UnsupportedOperationException();
    }
}

我不知道出了什么问题我遇到了以下错误请帮我解决这些问题

=>;德克。java:25:error:Deque。DequeIterator不是抽象的,并且不重写Iterable中的抽象方法迭代器()

=>;德克。java:35:错误:不兼容的类型 项目ret=PELENT。信息技术 ^ 必填项:第2项 找到:项目#1

=>;德克。java:121:错误:不兼容的类型 返回新的DequeIterator(); ^ 必需:迭代器 发现:德克。迭代器


共 (5) 个答案

  1. # 1 楼答案

    在类DequeIterator<Item>中实现Iterable接口时,必须重写iterator()方法

    hasNext(), next(), remove() - these methods are in Iterator interface.
    
  2. # 2 楼答案

    Deque.java:25: error: Deque.DequeIterator is not abstract and does not override abstract method iterator() in Iterable

    在类Iterable中存在方法iterator(),它是抽象的。你负责实现每一种抽象方法

  3. # 3 楼答案

    你实现了错误的接口^{}要求您实现iterator()方法,但您没有提供该方法。因此,第一个错误

    您可能想要实现^{},这需要hasNext()next()remove()

    您没有显示代码的其余部分,但我假定您有Deque.java,其中包含链接列表代码的其余部分(即对head等的引用),因此您可能希望使用Deque implements Iterable<Item>iterator()方法返回DequeIterator的实例

    您还需要从DequeueIterator中删除<Item>。您已经说过它实现了Iterable<Item>,所以您限制了类型。而是将其更改为泛型类型,这就是第二个错误的原因。我假定Item是在其他地方定义的一个具体类(尤其是因为pElement返回它,并且没有与之关联的泛型类型)

    第三个错误,不知道121行是什么,你没有包括在内。但最可能的原因与我上面提到的相同(DequeIterator需要实现Iterator而不是Iterable

  4. # 4 楼答案

    看起来您的内部DequeIterator类正在重写顶级Deque<Item>类的<Item>泛型。只需从DequeIterator定义中删除<Item>。另外,应该实现Iterable的类必须是Deque类,并且DequeIterator必须实现Iterator

    public class Deque<Item> implements Iterable<Item> {
        //implementation...
        private class DequeIterator implements Iterator<Item> {
            //implementation...
        }
    }
    
  5. # 5 楼答案

    迭代器实现Iterable,而不是实现迭代器。总是在应该重写基类或接口方法的方法上添加@Override注释