为什么即使实现了 Iterable 也会出现 foreach 编译器错误?

Why do I get a foreach compiler error even though Iterable is implemented?

我正在尝试学习 OOP 中的不同设计模式,而我目前正在学习的是迭代器模式。因此我制作了两个自己的接口(Iterable 和 Iterator)。

我正在尝试迭代 List<Person> friends。但是行:for (Person p : p1) 给出了以下编译器错误:

foreach not applicable to type 'com.company.Person'

这对我来说毫无意义,因为据我所知,我已经实现了 Iterable 并覆盖了 iterator() 方法。

谁能告诉我我错过了什么?

这是我的代码:

主要class:

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--);
                }
            }
        };
    }
}

您似乎已经定义了自己的 IteratorIterable 接口。这不是 foreach 循环在 Java.

中的工作方式

要使 class 成为 foreach 循环的可行目标,它必须实现内置 Iterable,参见 java.lang.Iterable。删除您自己的 IteratorIterable 接口,并实现内置的 Iterable(并使用内置的 Iterator)。

此外,就您的语义而言,将 Person class 设为 Iterable 可能意义不大。该人的好友集合应该是Iterable。相反,您可能希望通过 getFriends() 方法公开朋友集合,该方法 return 该列表的不可修改视图 (Collections.unmodifiableList(friends))。该列表已经 Iterable,您无需首先实施它。