Ответ
Да, может, если объект реализует интерфейс Iterable<T>. Для этого необходимо переопределить метод iterator(), который должен возвращать корректный объект Iterator<T>.
Почему это работает: Цикл for-each (for (Type item : collection)) на уровне компилятора преобразуется в итерацию по Iterator, полученному вызовом метода iterator() у объекта, реализующего Iterable.
Пример реализации:
import java.util.*;
class MyCollection<T> implements Iterable<T> {
private List<T> items = new ArrayList<>();
public void add(T item) {
items.add(item);
}
@Override
public Iterator<T> iterator() {
// Возвращаем итератор внутреннего списка
return items.iterator();
}
}
// Использование:
public class Main {
public static void main(String[] args) {
MyCollection<String> collection = new MyCollection<>();
collection.add("A");
collection.add("B");
for (String s : collection) {
System.out.println(s); // Выведет A, затем B
}
}
}
Ключевые требования:
- Класс должен реализовывать
Iterable<T>. - Метод
iterator()должен возвращать объект, реализующийIterator<T>. - Возвращаемый итератор должен корректно реализовывать методы
hasNext()иnext().