Java Iterator实现编译错误:不覆盖抽象方法remove()

时间:2011-03-24 20:30:43

标签: java iterator

为什么我会收到以下编译错误:

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

}

5 个答案:

答案 0 :(得分:15)

Java 8

在Java 8中,remove method有一个抛出UnsupportedOperatorException的默认实现,所以在Java 8中代码编译得很好。


Java 7及以下

因为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!!!");
}