Я пытаюсь изучить различные шаблоны проектирования в ООП, и текущий, который я изучаю, является шаблоном итератора.Поэтому я сделал два собственных интерфейса (Iterable и Iterator).
Я пытаюсь перебрать List<Person> friends
.Но строка: for (Person p : p1)
выдает следующую ошибку компилятора:
foreach not applicable to type 'com.company.Person'
Что для меня не имеет смысла, так как я реализовал Iterable и переопределил метод iterator (), насколько я вижу.
Может кто-нибудь сказать мне, что мне не хватает?
Вот мой код:
Основной класс:
Person p1 = new Person("Erik");
p1.addFriend("Lars");
p1.addFriend("Jenny");
p1.addFriend("Janne");
for (Person p : p1) {
System.out.println(p.name);
}
Итератор:
public interface Iterator<T> {
boolean hasNext();
T next();
void remove();
}
Итерируемый:
public interface Iterable<T> {
Iterator<T> iterator();
}
Человек:
public class Person implements Iterable<Person>{
private List<Person> friends = new ArrayList<>();
String name;
int index = 0;
public Person(String name){
this.name = name;
}
public void addFriend(String name){
friends.add(new Person(name));
}
@Override
public Iterator<Person> iterator(){
return new Iterator<Person>() {
//int index = 0;
@Override
public boolean hasNext() {
System.out.println(index);
return index < friends.size();
}
@Override
public Person next() {
if(hasNext()){
return friends.get(index++);
}
else{
return null;
}
}
@Override
public void remove() {
if(index<=0) {
friends.remove(index--);
}
}
};
}
}