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

时间:2018-12-21 18:49:22

标签: java design-patterns foreach iterator iterable

我正在尝试在OOP中学习不同的设计模式,而目前正在学习的是迭代器模式。因此,我做了两个自己的接口(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--);
                }
            }
        };
    }
}

1 个答案:

答案 0 :(得分:0)

您似乎已经定义了自己的IteratorIterable接口。这不是Java中的foreach循环的工作方式。

要使一个类成为foreach循环的可行目标,它必须实现内置的Iterable,如java.lang.Iterable所示。删除自己的IteratorIterable接口,并实现内置的Iterable(也使用内置的Iterator)。

此外,就您的语义而言,将Person类设为Iterable可能没有多大意义。该人的朋友的收藏集应为Iterable。相反,您可能想通过getFriends()方法公开朋友的集合,该方法将返回该列表(Collections.unmodifiableList(friends))的不可修改视图。该列表已经Iterable,从而使您无需首先实现它。