yohhoyの日記

技術的メモをしていきたい日記

Curiously Recurring Generic Pattern

プログラミング言語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 AutoCloseable
java.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