Интерфейс итератора SCJP

import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

public class TryMe {

    public static void main(String args[]) {

        List list = new LinkedList<String>();

        list.add("one");
        list.add("two");
        list.add("three");

        Collections.reverse(list);

        Iterator iter = list.iterator();

        for (Object o : iter) {
            System.out.print(o + " ");
        }
    }
}

Этот вопрос от SCJP, у меня проблемы с пониманием итератора и итерации.

Я знаю, что итератор - это интерфейс с методом итератора. Почему мы не можем использовать для каждого цикла в случае итератора? Компилятор говорит: может перебирать только массив или экземпляр java.lang.iterable. что это? я много пытался искать, но не получил ответа

Ответьте, пожалуйста


person user2985842    schedule 13.03.2014    source источник
comment
Поскольку Iterator не является и Iterable. Это два разных интерфейса.   -  person Luiggi Mendoza    schedule 14.03.2014
comment
вы выполняете итерацию по итерации, а не по итератору   -  person jmj    schedule 14.03.2014
comment
связанные: stackoverflow.com/questions/6863182/   -  person    schedule 14.03.2014
comment
@RC. это не связано, это возможный дубликат   -  person Luiggi Mendoza    schedule 14.03.2014
comment
Между прочим, компилятор довольно ясно понимает вашу проблему: может выполнять итерацию только по массиву или экземпляру java.lang.Iterable, так что вы можете t перебирать Iterator   -  person Luiggi Mendoza    schedule 14.03.2014


Ответы (2)


Есть разница между Iterable и Iterator. Iterator – это объект, элементы другого объекта, Iterable. Iterable содержит элементы и предоставляет объект Iterator (с методом iterator()), который перебирает элементы Iterable.

Усовершенствованный цикл for должен принимать Iterable, чтобы он мог вызывать iterator() для получения гарантированного нового Iterator для неявного перебора элементов.

Это обеспечивается JLS. , Раздел 14.14.2:

Расширенный оператор for имеет вид:

EnhancedForStatement:
    for ( FormalParameter : Expression ) Statement

и

Тип Expression должен быть Iterable или типом массива (§10.1), иначе возникнет ошибка времени компиляции.

person rgettman    schedule 13.03.2014

List это Iterable, а Iterator нет.

Это будет работать:

    for (Object o : list) {
person Jonas Fagundes    schedule 13.03.2014