2

我有以下代码

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 循环,但我不确定如何从这里开始。

4

3 回答 3

2

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

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

相反,不是内部类的 Iterator 可能看起来更像:

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();
    }
}
于 2013-05-26T21:18:53.010 回答
1

当你实现Iterable时,你可以使用for:each循环语法:

实现这个接口允许一个对象成为“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() {
        //...
    }
}
于 2013-05-26T20:54:23.870 回答
0

虽然 [this answer] 提供了Iterable实现的常规语法,但 an在没有-implementing 类的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{
...
}

}

使用这种范式,可以想象您可能会在同一个类中为不同的目的使用不同的迭代器。

implement Iterable从 OOP 的角度来看,当您将迭代的类没有意义时,您永远不应该创建一个类(,如果该类不是数据/存储结构)。

于 2016-08-04T20:12:54.377 回答