在Java中实现Iterable

时间:2014-04-08 00:05:37

标签: java foreach iterator adt

//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我自己的代码,但我似乎没有工作。

1 个答案:

答案 0 :(得分:2)

问题在于,当内部类ArrIterator仍处于外部类<E>的范围内时,它正在重新定义另一个泛型类型参数Bag。这会导致新E与旧版E不匹配。

根据Section 6.3 of the JLS

  

类的类型参数(第8.1.2节)的范围是类声明的类型参数部分,类声明的任何超类或超接口的类型参数部分,以及类体。

删除内部类EArrIterator的重新声明,并让其extends子句使用范围内的E

public class ArrIterator implements Iterator<E> {    

然后,您的iterator()方法不必返回通用ArrIterator

public Iterator<E> iterator() {
    return new ArrIterator(this);
}  

此外,迭代器中的hasNext方法应返回boolean以匹配Iterator接口。