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

内部クラスとしての Iterator は次のようになります。

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

[この回答] は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はありません。

于 2016-08-04T20:12:54.377 に答える