menu
書いてる野郎
orebike@gmail.com
型情報を動的注入する仕組み。軽めのメタプログラミング。 フレームワークを作るような場合にあると便利な機能
ジェネリクスの仕組みを作る方はあまりしないが使う方は日常的にやっている。
List<String> hogeList = new ArrayList<String>();
この意味は、List はどの型でも入るけど、String に限定するよということを後で入れているということになる。
コンストラクタのパラメータに型情報を取れるクラスを受けるための変数の宣言時に型情報を注入することができる。
List<String> hoge;
ベースとなる型の後ろに<String>
のように型情報を括弧でくくって渡す。
必要な型情報はクラスやインタフェースによっては複数ある場合もある。その時はこのようにコンマに続けて書く
Map<String, Boolean> hoge;
型情報を外部から取る型を型情報に使うこともできる。 そうなると、型情報も入れ子構造に宣言してやる必要がある
Map<String, List<Boolean>> hoge;
このようにする。
コンストラクタのパラメータに型情報を取れるクラスの生成時に型情報を注入することができる。
List<String> hoge = new ArrayList<String>();
ベースとなる型のコンストラクタ直後、実行のための()
の前に<String>
のように型情報を括弧でくくって渡す。
複数パラメータ、入れ子パラメータに関しても変数宣言時と同様に記述する
新しい Java では型推論が効いて型情報が省略可能だったりする。
List<String> hoge = new ArrayList<>();
型情報を必要とするクラスを継承する際に型情報を注入することができる。
public class Hoge extends Piyo<String>{ }
この場合なら型情報を必要とするPiyoクラスにStringクラスの情報を渡したモノをHogeクラスが継承していることになる。
上記は型情報の注入側だったが、ここは型情報を受け取ってどう使うかということ。
クラス宣言の後ろに<T>
のような形で型パラメータの受けを記述する
public class Hoge<T>{ }
このようにすると、このクラスのインスタンスを受けるための変数作成時に型情報の注入が促される。
このT
は型パラメータで、「T」とか「E」とかのアルファベット大文字1文字がよく使われる。
型情報を複数取りたい場合はコンマで書き込む
public class Hoge<T, E>{ }
入れ子パラメータは、型への型情報の注入は使われる型の情報であって、型の使い方では無い。 なので入れ子構造のパラメータを作る必要も無い。
このような型パラメータを受けるクラスがああり
public class Hoge<T>{ public List<T> piyoList; }
このように型パラメータを注入して作成する
Hoge<String> hoge = new Hoge<String>();
するとクラスは
public class Hoge{ public List<String> piyoList; }
のように振る舞う