以下の問題で悩んでいます。一連の関数オブジェクトがあり、それぞれがJavaのジェネリック型引数を介して定義された独自の入力型と出力型を持っています。生データが最初の関数に入力され、次のオブジェクトの入力型である出力型に変換されるように、これらをチェーンに配置したいと思います。もちろん、これはハードコードするのは簡単ですが、コードを新しい関数オブジェクトにプラグインできるようにしたいと思います。型引数 (最終的な出力型のみ) を省略すると、次のようになります。
public T process() {
Iterator<Context> it = source.provideData();
for(Pipe pipe : pipeline) {
it = pipe.processIterator(it);
}
return sink.next(it);
}
ここでは、データに対する反復子が関数オブジェクト間で渡され、コンテキストは Context である必要があります。次の種類のパイプをプラグ可能に保ち、タイプの安全性を維持する方法はありますか?
編集:わかりやすくするために、一連の関数オブジェクト、パイプがあります。それぞれが特定の型を入力として受け取り、別の型を出力します。(実際には、これらの型のイテレータ) これらは連鎖されます。たとえば、Pipe<A,B> -> Pipe<B,C> -> Pipe<C,D> -> ...
1 つのパイプの出力が次のパイプの入力型になるようにします。ここには、タイプ A の反復子を出力するソースと、タイプ (過去のパイプの出力) を受け入れるシンクもあります。これは物事をより明確にしますか?問題は、入力と出力の型の互換性に大きく依存しているため、これを保証する方法はあるのでしょうか?
関数オブジェクトをパイプラインに挿入するときが、型の安全性を確保するのに最適な時期かもしれないと考え始めていますが、これを行う方法がわかりません。
編集 2: 現在、以下のような関数オブジェクトの adder メソッドがあります。
public void addPipe(Pipe<?,?> pipe) {
pipeline.add(pipe);
}
最初の型パラメーターが現在のパイプの「終了」と同じかどうかを確認し、そうでない場合は例外をスローしますか? ここでコンパイル時の安全性を確保する良い方法があるとは思いません。現在のパイプの「終了」は、入力パイプの 2 番目のタイプのパラメーターに設定できます。ジェネリックでこれを行う方法が思い浮かびません。また、クラス情報を渡すのは非常に恐ろしいようです。