簡體   English   中英

即使實現了Iterable,為什么也會出現foreach編譯器錯誤?

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

我正在嘗試在OOP中學習不同的設計模式,而當前正在學習的是迭代器模式。 因此,我做了兩個自己的接口(Iterable和Iterator)。

我正在嘗試遍歷List<Person> friends 但是row: 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--);
                }
            }
        };
    }
}

看起來您已經定義了自己的IteratorIterable接口。 這不是Java中的foreach循環的工作方式。

為了使一個類成為foreach循環的可行目標,它必須實現內置的Iterable ,如java.lang.Iterable 刪除自己的IteratorIterable接口,並實現內置的Iterable (並同時使用內置的Iterator )。

此外,就您的語義而言,使Person類為Iterable可能沒有多大意義。 該人的朋友的收藏應該是Iterable 相反,您可能希望通過getFriends()方法公開朋友的集合,該方法將返回該列表的不可修改視圖( Collections.unmodifiableList(friends) )。 該列表已經是Iterable ,因此您無需首先實現它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM