1

Iterator を FooIterator と呼ぶものにサブクラス化したいと考えています。私のコードは次のようになります。

public class FooIterator<E> implements Iterator<E> {
  public FooIterator(Collection<Bar> bars) {
    innerIterator = bars.iterator();
  }

  @Override
  public boolean hasNext() {
    return innerIterator.hasNext();
  }

  @SuppressWarnings("unchecked")
  @Override
  public E next() {
    Bar bar = innerIterator.next();
    return new E(bar);
  }

  @Override
  public void remove() {
    throw new UnsupportedOperationException("Don't remove from FooIterator!");
  }

  private Iterator<Bar> innerIterator;
}

...もちろん、バーから新しい E をインスタンス化できないため、これは機能しません。

これは、Bar を取るコンストラクターを持つ E でのみ使用します。それをコンパイラに「証明」する方法、または E に適切なコンストラクタがない場合に実行時エラーをスローする方法はありますか?

それとも、ここで正しいデザインパターンを使用していないだけですか? 私は最近、多くの C++ を行っていますが、これに間違った方法でアプローチしているのではないかと感じています。

4

4 に答える 4

3

これはやや複雑なアプローチですが、機能する可能性があり、タイプ セーフになります (リフレクションを使用したソリューションはそうではありません)。それは基本的に、Ea から aの構築をBar別のクラスに委譲することにあります。インターフェースを持つことができBarConverterます:

interface BarConverter<E> {
    E convert (Bar bar);
}

次に、クラスは次のようになります。

public class FooIterator<E> implements Iterator<E> {

    public FooIterator(Collection<Bar> bars, BarConverter<E> converter) {
        innerIterator = bars.iterator();
        this.converter = converter;
    }

    @Override
    public E next() {
        Bar bar = innerIterator.next();
        return converter(bar);
    }
}
于 2013-08-07T23:06:01.580 に答える
0

考えられる解決策は、パラメータ化Barしてメソッドを追加し、新しい を作成することEです。このようなもの:

class Bar<E> {

    // ... more implementation ...

    public E build() {
        // create your `E` object here
    }

}

そして、あなたのコードは次のようになります:

public class FooIterator<E> implements Iterator<E> {

    public FooIterator(Collection<Bar<E>> bars) {
        innerIterator = bars.iterator();
    }

    @Override
    public boolean hasNext() {
        return innerIterator.hasNext();
    }

    @SuppressWarnings("unchecked")
    @Override
    public E next() {
        Bar<E> bar = innerIterator.next();
        return bar.build();
    }

    @Override
    public void remove() {
        throw new UnsupportedOperationException("Don't remove from FooIterator!");
    }

    private Iterator<Bar<E>> innerIterator;
}
于 2013-08-07T23:06:34.663 に答える