为什么即使实现了 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--);
}
}
};
}
}
您似乎已经定义了自己的 Iterator
和 Iterable
接口。这不是 foreach 循环在 Java.
中的工作方式
要使 class 成为 foreach 循环的可行目标,它必须实现内置 Iterable
,参见 java.lang.Iterable
。删除您自己的 Iterator
和 Iterable
接口,并实现内置的 Iterable
(并使用内置的 Iterator
)。
此外,就您的语义而言,将 Person
class 设为 Iterable
可能意义不大。该人的好友集合应该是Iterable
。相反,您可能希望通过 getFriends()
方法公开朋友集合,该方法 return 该列表的不可修改视图 (Collections.unmodifiableList(friends)
)。该列表已经 Iterable
,您无需首先实施它。
我正在尝试学习 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--);
}
}
};
}
}
您似乎已经定义了自己的 Iterator
和 Iterable
接口。这不是 foreach 循环在 Java.
要使 class 成为 foreach 循环的可行目标,它必须实现内置 Iterable
,参见 java.lang.Iterable
。删除您自己的 Iterator
和 Iterable
接口,并实现内置的 Iterable
(并使用内置的 Iterator
)。
此外,就您的语义而言,将 Person
class 设为 Iterable
可能意义不大。该人的好友集合应该是Iterable
。相反,您可能希望通过 getFriends()
方法公开朋友集合,该方法 return 该列表的不可修改视图 (Collections.unmodifiableList(friends)
)。该列表已经 Iterable
,您无需首先实施它。