//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/

10-10 15:27