#java #eclipse #iterator #iterable
#java #затмение #итератор #итеративный
Вопрос:
Это пример, выполняемый в нашем классе Java сегодня без проблем, но когда я добавил файлы в новый проект, у меня возникла следующая ошибка. Не могли бы вы сказать мне, если я добавил файлы неправильно или, может быть, профессор использовал немного другую версию файлов? Можете ли вы сообщить мне, в чем причина этой ошибки и как ее исправить?
Код для каждого файла выглядит следующим образом: ArrayGSackIterable.java : импортировать java.util.Итератор;
public class ArrayGSackIterable<T> extends ArrayGSack<T> implements GSackIterableADT<T> {
public Iterator<T> iterator() {
return new ArrayGSackIterator<T>(items, numItems);
}
}
и для ArrayGSackIterator.java:
import java.util.Iterator;
import java.util.NoSuchElementException;
public class ArrayGSackIterator<E> implements Iterator<E> {
private E[] items;
private int numItems, curr;
public ArrayGSackIterator(E[] gsackitems, int num) {
items = gsackitems;
numItems = num;
}
public boolean hasNext() {
return curr < numItems;
}
public E next() {
if (!hasNext()) throw new NoSuchElementException();
return items[curr ];
}
public void remove() {
}
}
и, наконец, для GSackIterableADT.java:
import java.util.Iterator;
import java.util.NoSuchElementException;
public interface GSackIterableADT<T> extends Iterable<T> {
void add(T item);
T remove() throws NoSuchElementException;
boolean isEmpty();
Iterator<T> iterator();
}
ОБНОВЛЕНИЕ: по-видимому, мне пришлось добавить эти два файла из другого ZIP-файла. GSackADT.java:
import java.util.NoSuchElementException;
public interface GSackADT<T> {
void add(T item);
T remove() throws NoSuchElementException;
boolean isEmpty();
}
ArrayGSack.java:
import java.util.NoSuchElementException;
public class ArrayGSack<T> implements GSackADT<T> {
// Internal storage and accounting members
protected T[] items;
protected int numItems;
private static final int INIT_SIZE = 100;
public ArrayGSack() {
items = (T[]) new Object[INIT_SIZE];
numItems = 0;
}
public void add(T item) {
if (numItems == items.length) expandStorage();
items[numItems ] = item;
}
public T remove() throws NoSuchElementException {
if (numItems < 1) throw new NoSuchElementException();
return items[numItems--];
}
public boolean isEmpty() {
return numItems == 0;
}
// Internal method to handle capacity issues
private void expandStorage() {
T[] oldItems = items;
items = (T[]) new Object[2 * items.length];
for (int i = 0; i < oldItems.length; i )
items[i] = oldItems[i];
}
}
Комментарии:
1. ваш класс
ArrayGSackIterable
реализуетGSackIterableADT
, но не предоставляет реализацию для всех абстрактных методов2. Что такое
ArratGSack
?
Ответ №1:
Ваш код жалуется на нереализованный метод remove
из интерфейса GSackIterableADT
. Ваш профессор, возможно, сделал любой из них, чтобы заставить его работать:
- Удаленный
remove
метод изGSackIterableADT
интерфейса - Помечен
ArrayGSackIterable
как абстрактный класс
Комментарии:
1. Я прокомментировал весь код, связанный с удалением, но все же получаю сообщение об ошибке. Что касается второго подхода, я не уверен, как это сделать. Не могли бы вы, пожалуйста, более подробно описать какой-нибудь возможный фрагмент кода?
2. @MonaJalal Для второго подхода просто добавьте abstract в определение вашего класса: общедоступный абстрактный класс ArrayGSackIterable . Но если вы отметите класс abstract, вы не сможете создать его экземпляр. Тогда он будет предназначен для расширения и использования.
3. ну, это не помогло. В нем говорится, что ArrayGSack не может быть преобразован в тип!
4. @MonaJalal это, по-видимому, является причиной вашей проблемы, вам также нужен класс ArrayGSack .