[英]Why do I get an error for not having a return statement even though I have one in my for loop?
[英]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--);
}
}
};
}
}
看起來您已經定義了自己的Iterator
和Iterable
接口。 這不是Java中的foreach循環的工作方式。
為了使一個類成為foreach循環的可行目標,它必須實現內置的Iterable
,如java.lang.Iterable
。 刪除自己的Iterator
和Iterable
接口,並實現內置的Iterable
(並同時使用內置的Iterator
)。
此外,就您的語義而言,使Person
類為Iterable
可能沒有多大意義。 該人的朋友的收藏應該是Iterable
。 相反,您可能希望通過getFriends()
方法公開朋友的集合,該方法將返回該列表的不可修改視圖( Collections.unmodifiableList(friends)
)。 該列表已經是Iterable
,因此您無需首先實現它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.