//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,但是我的代码似乎不起作用。
最佳答案
问题在于,当内部类ArrIterator
仍在外部类<E>
的作用域内时,它正在重新定义另一个通用类型参数Bag
。这会导致新的E
与旧的E
不匹配。
根据Section 6.3 of the JLS:
类的类型参数(第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
接口。关于java - Java中Iterable的实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22925268/