Java - 在不使用内部迭代器类的情况下实现自定义Iterable

时间:2013-05-26 20:44:57

标签: java

我有以下代码

public class SBag<Item> implements BagInterface<Item>, Iterable<Item> {

当我尝试编译时,我得到了

SBag.java:12: error: SBag is not abstract and does not override abstract method
iterator() in Iterable
public class SBag<Item> implements BagInterface<Item>, Iterable<Item>{
       ^
 where Item is a type-variable:
Item extends Object declared in class SBag

我的任务是在不使用内部迭代器类的情况下实现Iterable,但我不确定如何执行此操作,因为我在编译时遇到了这个错误。我有以下方法add(),isFull(),toArray(),isEmpty(),getCurrentSize(),remove(),clear()和toString()。总体目标是能够使用for-each循环,但我不确定如何从这里继续。

3 个答案:

答案 0 :(得分:2)

作为内部类的迭代器看起来像这样:

class MyIterable implements Iterable {
    public Iterator iterator() {
        return new Iterator() {
            public boolean hasNext() {...}
            public Object next() {...}
            void remove();
        }
    }
}

相比之下,不是内部类的迭代器可能看起来更像:

class MyIterable implements Iterable {
    public Iterator iterator() {
        return new MyIterator();
    }
}

class MyIterator {
    public boolean hasNext() {...}
    public Object next() {...}
    void remove();
}

这是从技术上说而不是内心阶级的另一种方式,但如果你这样说,有些人会看着你很有趣:

class MyIterable implements Iterable {
    public Iterator iterator() {
        return new MyIterator();
    }

    static class MyIterator {
        public boolean hasNext() {...}
        public Object next() {...}
        void remove();
    }
}

答案 1 :(得分:1)

当您实施Iterable时,您可以将用于:每个循环语法:

  

实现此接口允许对象成为目标   “foreach”声明。

Iterable通用接口,您应该实现它包含的方法:

public class MyIterable<E> implements Iterable<E>{
    public Iterator<E> iterator() {    // <--- Implement me!
        return new CustomIterator<E>();
    }
}

然后,例如,您可以执行以下操作:

public class CustomIterator<T> implements Iterator<T> {
    public boolean hasNext() {
         //...
    }

    public T next() {
        //...
    }

    public void remove() {
        //...
    }
}

答案 2 :(得分:0)

虽然[此答案]提供了Iterable实现的常规语法,但Iterator在没有Iterable实现类的情况下非常有用。例如:

public class DoesntIterate{

public void coolMethod(){
//Do stuff
Iterator iter = getMyIterator();
   while(iter.hasNext()){
   //Do stuff with iter.next()
   }
}

private Iterator getMyIterator(){
   return new MyIterator();
}

private class MyIterator implements Iterator{
...
}

}

通过这种范例,可以想象您可以在同一个类中使用不同的迭代器用于不同的目的

从OOP的角度来看,你永远不应该创建一个类implement Iterable,因为它不适合你将要迭代的(即该类不是数据/存储结构。)