プログラミング言語Javaのジェネリクス(Generics)利用パターンに関するメモ。継承/実装する親クラス/インタフェースのジェネリクス仮型引数に、そのクラス/インタフェース自身を再帰的に渡せる。
→ Cf.プログラミング言語C++でのCRTP(Curiously Recurring Template Pattern)
インタフェースBaseStream<T,S extends BaseStream<T,S>>
型パラメータ:
T
- ストリーム要素の型
S
-BaseStream
を実装するストリームの型public interface BaseStream<T, S extends BaseStream<T,S>> extends AutoCloseablejava.util.stream.BaseStreamインタフェース
具体的な利用例は下記コードの通り。BaseStream
に与える仮型引数はT=Foo
、S=FooStream
自身となっている。このとき、FooStream
は上限境界ワイルドカードS extends BaseStream<T,S>
を満足している。
import java.util.stream.BaseStream; public class Foo { ... } // BaseStreamインタフェースを実装 public class FooStream implements BaseStream<Foo, FooStream> { ... }
関連URL