在Java </obj>中覆盖Iterables <obj>的正确方法

时间:2014-03-12 16:05:39

标签: java iterator linked-list

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

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();
    }
}

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

=&GT; Deque.java:25:错误:Deque.DequeIterator不是抽象的,并且不会覆盖Iterable中的抽象方法iterator()

=&gt; Deque.java:35:error:不兼容的类型             Item ret = pElement.it;                                ^   要求:项目#2   发现:项目#1

=&gt; Deque.java:121:错误:不兼容的类型         return new DequeIterator();                ^   要求:迭代器   发现:Deque.DequeIterator

5 个答案:

答案 0 :(得分:5)

您正在实施错误的界面。 Iterable要求您实施您未提供的iterator()方法。因此第一个错误。

您可能希望实现Iterator,这需要hasNext()next()remove()

你没有显示你的其余代码,但我认为你有Deque.java其余的链表代码(即对head的引用等),所以可能您可能希望Deque implements Iterable<Item>使用iterator()方法返回DequeIterator的实例。

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

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

答案 1 :(得分:1)

您的内部DequeIterator类似乎覆盖了顶级<Item>中的Deque<Item>泛型。只需从<Item>定义中删除DequeIterator即可。此外,应该实现Iterable的类必须是您的Deque类,DequeIterator必须实现Iterator

public class Deque<Item> implements Iterable<Item> {
    //implementation...
    private class DequeIterator implements Iterator<Item> {
        //implementation...
    }
}

答案 2 :(得分:0)

  

Deque.java:25:错误:Deque.DequeIterator不是抽象的,也不是   在Iterable中覆盖抽象方法iterator()

在课程Iterable中存在方法iterator(),这是抽象的。您负责实现每个抽象方法。

答案 3 :(得分:0)

您必须覆盖类iterator()中的DequeIterator<Item>方法,因为它实现了Iterable接口。

hasNext(), next(), remove() - these methods are in Iterator interface.

答案 4 :(得分:0)

您的Iterator实现Iterable而不是实现Iterator。始终在应该覆盖基类或接口方法的方法上添加@Override注释。