java - Java中Iterable的实现

标签 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,但我的代码似乎不起作用。

最佳答案

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

根据Section 6.3 of the JLS :

The scope of a class's type parameter (§8.1.2) is the type parameter section of the class declaration, the type parameter section of any superclass or superinterface of the class declaration, and the class body.

删除E的重新声明在你的内部类(Class)中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/

相关文章:

java - 将Java函数绑定(bind)到Lua的方法?

c++ - 增加迭代器标准映射

java - ArrayList::iterator 中的 i >= elementData.length 是多余的吗?

java - 在 Java 中重写常量

java - 获取文件csv上传并添加mysql

java - 从 forEach java 8 获取返回列表

php - foreach循环php中的总和值

C++ for_each 调用回调函数 vector 并向每个回调函数传递一个参数

java - 接口(interface)方法如何在没有主体定义的情况下执行 Java 中的功能?

Java递归趣味测试错误