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++ を行っていますが、これに間違った方法でアプローチしているのではないかと感じています。