Ошибка компиляции реализации Java Iterator: не переопределяет абстрактный метод remove () - PullRequest
6 голосов
/ 24 марта 2011

Почему я получаю следующую ошибку компиляции:

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 ]

15 голосов
/ 24 марта 2011

Java 8

В Java 8 метод remove имеет реализацию по умолчанию, которая выдает UnsupportedOperatorException, поэтому в Java 8 код компилируется нормально.


Java 7 и ниже

Поскольку интерфейс Iterator имеет метод, называемый remove(), который вы должны реализовать, чтобы сказать, что вы реализовали интерфейс Iterator.

Если вы не реализуете его, класс "пропустит" реализацию метода, что нормально только для абстрактных классов, то есть классов, которые откладывают реализацию некоторые методы для подклассов.

Документация может показаться запутанной, поскольку в ней говорится, что remove() является "необязательной операцией". Это означает только то, что вам не нужно фактически удалять элементы из базовой реализации, но вам все равно нужно реализовать метод. Если вы действительно не хотите ничего удалять из базовой коллекции, вы реализуете это следующим образом:

public void remove() {
    throw new UnsupportedOperationException();
}
3 голосов
/ 24 марта 2011

Вы должны внедрить remove, потому что он является частью договора, определенного интерфейсом Iterator.

Если вы не хотите внедрятьзатем он вызывает исключение:

public void remove() {
    throw new UnsupportedOperationException();
}
2 голосов
/ 24 марта 2011

Итератор - это интерфейс, который означает, что вы должны реализовать все методы

public interface Iterator<E> {
    boolean hasNext();
    E next();
    void remove();
}

hasNext () и next () у вас уже есть, поэтому просто добавьте метод remove ()

Если у вас нет идеи, просто выбросьте соответствующее исключение:

public void remove() {
    throw new UnsupportedOperationException();
}
2 голосов
/ 24 марта 2011

... поскольку вы не предоставляете определение для remove(), а Iterator является интерфейсом, поэтому вы должны предоставить определение для всех его функций для любой конкретной реализации.

Однако вы можете добавить метод, который вызывает исключение, если вы не хотите поддерживать функциональность:

public void remove(){
    throw new UnsupportedOperationException();
}
0 голосов
/ 24 марта 2011

Вы должны добавить

public Object remove() {
  throw new RuntimeException ("I'm not going to implement it!!!");
}
...