2

クラスには、コンテナがあります。

public class MyClass implements MyClassInterface {
  private LinkedList<OtherClass> list; //Need to use 'OtherClass' instead of 'OtherClassInterface here
  @Override
  public Iterator iterator() {
    return list.iterator; //Problem!
  }
}

インターフェース:

public interface MyClassInterface {
  //Is
  public Iterator iterator();
  //Should be
  public Iterator<OtherClassInterface>();
}

次にOtherClass、インターフェイスもありますOtherClassInterface。コードを操作する人がインターフェイスだけを使用するようにしたい。OtherClass問題は、内部全体を使用したいが、の呼び出し元にMyClassイテレータを渡すことです。LinkedList<OtherClassInterface>MyClassInterface.iterator()

既存のイテレータLinkedList<OtherClass>LinkedList<OtherClassInterface>内部にキャストしMyClassて、目的のイテレータを返すことができませんでした。

そのような状況にどう対処するか?

編集

この動作が必要な理由

別の開発者のために、2つのインターフェースを提供したいと思います。1つ目は、2つ目のインターフェースでアクセスする必要のある、より低いデータ構造を含むより高いデータ構造へのアクセスを提供します。上位インターフェイスの実装クラスでは、下位インターフェイスではなく、下位データ構造のタイプを直接使用します。

前述のように、他の開発者は両方のインターフェイスを使用したいと考えています。上位のものの上に、下位インターフェースの要素へのアクセスを提供するイテレーターを提供したいのですが、インターフェースを実装するクラスにはアクセスできません。

追加のニーズ

また、返されるイテレータを「Iterable」にする必要があります。つまり、「foreach」構造を使用できるようにします。これは*waxwing*のソリューションでも可能ですか?可能であれば、独自のイテレータを実装したくありません。実装クラスではなく、インターフェイスの要素に対してイテレータを提供したいだけなので、これは必要ないようです。

4

4 に答える 4

1

インターフェースを変更できますか?

public interface MyClassInterface<T> {
    public Iterator<T> iterator();
}

いつでも独自のイテレータを実装できます:

public class MyClass implements MyClassInterface<T> {
  private LinkedList<T> list;

  @Override
  public Iterator iterator() {
   return new Iterator<T>() {
            int index;

            public boolean hasNext() {
                return index < list.size();
            }

            public T next() {
                return list.get(index++);
            }

            public void remove() {

            }
        };
  }
}

コードをテストしませんでした

于 2012-05-17T12:08:31.750 に答える
1

Iteratorから戻るときにインターフェースと具体的な実装の間で変換する独自の実装を書くことができますnext()

List<OtherClass>に変換する際の問題List<OtherClassInterface>は、変換結果のユーザーがオブジェクト以外のOtherClassものをリストに入れるのを防ぐ方法がないことです(もちろん、これらの要素も実装する必要がありOtherClassInterfaceます)

于 2012-05-17T11:53:25.127 に答える
1

このようなインターフェースを定義できますか?

public interface MyClassInterface {
    public Iterator<? extends OtherClassInterface>();
}

list.iterator()listが。の場合でも、そのメソッドの有効な戻り値である必要がありますList<OtherClass>

于 2012-05-17T11:53:55.520 に答える
1

インターフェイスは次のように定義できます。

public interface MyClassInterface {
    public LinkedList<? extends OtherClassInterface> list();
}

次に、実装は次のようになります。

@Override
public LinkedList<OtherClass> list() {
    return list; //this is the container of type LinkedList<OtherClass>
}

これには次の利点があります。

  • オブジェクトで呼び出すとlist()OtherClassLinkedList<OtherClass>
  • オブジェクトで呼び出すとlist()OtherClassInterfaceLinkedList<OtherClassInterface>
  • それぞれの戻り値は、for-eachループで使用できます
  • イテレータは次の方法で取得できます。list().iterator()
于 2012-06-14T11:31:37.523 に答える