为什么我会收到以下编译错误:
LRIterator is not abstract and does not override abstract method remove() in java.util.Iterator
注意,实现是针对链表
public Iterator iterator()
{
return new LRIterator() ;
}
private class LRIterator implements Iterator
{
private DLLNode place ;
private LRIterator()
{
place = first ;
}
public boolean hasNext()
{
return (place != null) ;
}
public Object next()
{
if (place == null) throw new NoSuchElementException();
return place.elem ;
place = place.succ ;
}
}
答案 0 :(得分:15)
在Java 8中,remove
method有一个抛出UnsupportedOperatorException
的默认实现,所以在Java 8中代码编译得很好。
因为Iterator
接口有一个名为remove()
的方法,您必须实现该方法才能说明您已实现Iterator
接口。
如果不实现它,那么类“缺少”一个方法实现,这对于抽象类来说是可以的,即延迟的类一些方法实现到子类。
文档可能看起来令人困惑,因为它说remove()
是一个“可选操作”。这只意味着您不必实际能够从底层实现中删除元素,但仍需要实现该方法。如果你不想从底层集合中删除任何东西,你可以像这样实现它:
public void remove() {
throw new UnsupportedOperationException();
}
答案 1 :(得分:3)
您必须实施remove
,因为它是Iterator
界面定义的合同的一部分。
如果您不想实现它,请改为抛出异常:
public void remove() {
throw new UnsupportedOperationException();
}
答案 2 :(得分:2)
...因为您没有为remove()
提供定义,而Iterator
是一个接口,所以必须为其所有函数提供定义任何具体的实施。
但是,如果您不想支持该功能,则可以添加抛出异常的方法:
public void remove(){
throw new UnsupportedOperationException();
}
答案 3 :(得分:2)
Iterator是一个接口,意味着你应该实现所有方法
public interface Iterator<E> {
boolean hasNext();
E next();
void remove();
}
你已经拥有hasNext()和next(),所以只需添加remove()方法
如果你不知道只是抛出适当的例外:
public void remove() {
throw new UnsupportedOperationException();
}
答案 4 :(得分:0)
您必须添加
public Object remove() {
throw new RuntimeException ("I'm not going to implement it!!!");
}