【问题标题】:Correct Way to Override Iterables<Obj> in Java在 Java 中覆盖 Iterables<Obj> 的正确方法
【发布时间】:2014-04-16 22:13:49
【问题描述】:

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

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

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

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

=>Deque.java:35:错误:不兼容的类型 项目 ret = pElement.it; ^ 必需:项目#2 找到:项目#1

=>Deque.java:121:错误:不兼容的类型 返回新的 DequeIterator(); ^ 必需:迭代器 找到:Deque.DequeIterator

【问题讨论】:

  • 你已经声明类implements Iterable然后实现Iterator

标签: java iterator linked-list


【解决方案1】:

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

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

您没有显示其余代码,但我认为您有 Deque.java,其中包含其余的链表代码(即对 head 的引用等),所以您可能想要让Deque implements Iterable&lt;Item&gt;iterator() 方法返回DequeIterator 的实例。

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

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

【讨论】:

  • 哦,谢谢,您的建议解决了第一个和第三个错误,请告诉我如何解决第二个错误?
  • 只需将DequeIterator&lt;Item&gt; 更改为DequeIterator。您正在创建一个新的泛型类型,而事实上我认为您有一个名为 Item 的普通具体类。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    你必须重写你的类DequeIterator&lt;Item&gt;中的iterator()方法,因为它实现了Iterable接口。

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        看起来您的内部 DequeIterator 类正在覆盖顶级类 Deque&lt;Item&gt;&lt;Item&gt; 泛型。只需从 DequeIterator 定义中删除 &lt;Item&gt; 即可。此外,应该实现Iterable 的类必须是您的Deque 类,并且DequeIterator 必须实现Iterator

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

        【讨论】:

          猜你喜欢
          • 2015-05-06
          • 2012-10-11
          • 2016-10-19
          • 2023-04-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多