迭代器在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(); ^ 必需:迭代器 发现:德克。迭代器
# 1 楼答案
在类
DequeIterator<Item>
中实现Iterable
接口时,必须重写iterator()
方法# 2 楼答案
在类
Iterable
中存在方法iterator()
,它是抽象的。你负责实现每一种抽象方法# 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 楼答案
看起来您的内部
DequeIterator
类正在重写顶级Deque<Item>
类的<Item>
泛型。只需从DequeIterator
定义中删除<Item>
。另外,应该实现Iterable
的类必须是Deque
类,并且DequeIterator
必须实现Iterator
# 5 楼答案
迭代器实现Iterable,而不是实现迭代器。总是在应该重写基类或接口方法的方法上添加
@Override
注释