//project.java
import MULTISET;
public class Bag<E extends Keyed> implements Iterable<E> {
//cannot find symbol. symbol: class Iterator. location: class project.Bag<E>
public Iterator<E> iterator() {
return new ArrIterator(this);
}
//same error as above
public class ArrIterator implements Iterator<E> {
Bag<E> arr;
int coun;
public ArrIterator(Bag<E> arr) {
this.arr = arr;
this.coun = 0;
}
public boolean hasNext() {
return this.coun < arr.cardinality();
}
public E next() {
if (!hasNext()) {
throw new NoItemException();
}
return arr.getArray()[coun+1];
}
public void remove() {
throw new UnsupportedOperationException();
}
}
}
//MULTISET.java
//cannot find symbol. symbol: class Iterator. location: interface MultiSet<E>
public interface MultiSet<E extends Keyed> extends Iterable<E> {
public Iterator<E> iterator();
}
我试图在Bag类型上做foreach循环,我得到了两个注释错误。我对ADT,泛型或迭代器不太熟悉,但我认为我做了正确的事。
这里有什么遗漏和/或错误?这不是我的完整代码,但我遗漏的其他所有内容都有效。上面的代码片段中某处出现了问题。我所遵循的一个例子或多或少是1:1我自己的代码,但我似乎没有工作。
答案 0 :(得分:2)
问题在于,当内部类ArrIterator
仍处于外部类<E>
的范围内时,它正在重新定义另一个泛型类型参数Bag
。这会导致新E
与旧版E
不匹配。
类的类型参数(第8.1.2节)的范围是类声明的类型参数部分,类声明的任何超类或超接口的类型参数部分,以及类体。
删除内部类E
中ArrIterator
的重新声明,并让其extends
子句使用范围内的E
。
public class ArrIterator implements Iterator<E> {
然后,您的iterator()
方法不必返回通用ArrIterator
。
public Iterator<E> iterator() {
return new ArrIterator(this);
}
此外,迭代器中的hasNext
方法应返回boolean
以匹配Iterator
接口。