Пользовательский итератор возвращает объект - PullRequest
0 голосов
/ 11 января 2020

Я написал собственный итератор для класса MyList. Вот как это выглядит:

private class MyListIterator implements Iterator<ListItem> {
        // Constructor
        public MyListIterator() {
            nextElement = head;
        }

        @Override
        public ListItem next() {
        ...

    }

Затем в классе MyList я создаю новый MyListIterator, например:

@Override
    public Iterator<ListItem> iterator() {
        MyListIterator iterator = new MyListIterator();
        return iterator;
    }

и, наконец, я пытаюсь перебрать объект MyList, ожидающий ListItem s:

MyList list = new MyList();
for (ListItem item : list ) {
       System.out.println(item.value);
}

Но я получаю ошибку несовместимых типов, потому что итератор возвращает типы Object вместо ListItem. Как это исправить?

Редактировать: MyList реализует MyListInterface:

public interface MyListInterface<T extends Comparable<T>> extends Iterable<T> {
    public Iterator<T> iterator();
}

Но мне не разрешено что-либо менять в MyListInterface

private class ListItem {
        Comparable value;
        ListItem previous;
        ListItem next;

        public ListItem(Comparable value) {
            this.value = value;
        }
    }

Ответы [ 2 ]

0 голосов
/ 11 января 2020

Я предполагаю, что вы по ошибке написали MyList implements MyListInterface {, забыв добавить аргумент generi c. Это означает, что вы используете необработанный тип, и вы должны , а не сделать это. См. Что такое необработанный тип и почему мы не должны его использовать?

Необработанный тип MyListInterface имеет супер-интерфейс необработанного типа Iterator. Как только вы используете один необработанный тип, все связанные типы становятся необработанными (подробнее об этом см. В разделе JLS 4.8 ), поэтому в настоящее время ваш MyList реализует не-generi c Iterable, который возвращает non generi c Iterator, следующий метод которого возвращает Object s. Чтобы заставить MyList реализовать Iterable<ListItem>, вам нужно написать

class MyList implement MyListIterator<ListItem> {

Если ваш ListItem еще не Comparable<ListItem>, то также реализуйте это.

0 голосов
/ 11 января 2020

Ваш MyList класс implements Iterable вместо implements Iterable<ListItem>. Компилятор предупреждает вас об этом; обратите внимание на предупреждения.

При обновлении следует использовать implements MyListInterface<ListItem>. На самом деле вы получаете предупреждение, которое я упомянул (используйте тип raw MyListInterface) - эти предупреждения предназначены для того, чтобы помочь вам избежать и решить подобные проблемы.

...