総称型について一切知らなかった西森用の備忘録です。
調べるに至った経緯
先日、こんな感じの迷路のプログラムをJavaで作りました。
Javaで穴掘り法の迷路作成を実装してみた。
そこで先達の方(shiracamusさん)にバグを修正してもらったのですが、「ほほーなるほどー」と、そのプログラムに色々な知らないことが散りばめられていたので、調べようと思いました。
プログラム内に関数型インターフェースが使われていたので調べてみたのですが、そこでまずこのジェネリクスについてつまずいたので、備忘録としてここに記します。
ジェネリクス(総称型)って?
普段使ってるうえでよく目にするのがリストに入れる型の限定だと思います。
List<String> list = new ArrayList<String>();
こんな感じで。<String>の部分です。
基本的にListは色々なものを入れることができますが、こうして<>で括ることで入れる型を限定できるわけですね。
これが総称型です。ジェネリクスとも言います。
ちなみに上記の書き方でIntegerを入れようとするとコンパイルエラーが起きます。
このように、
1.コードのミスが発見しやすい(コンパイルエラー)。
2.コードを見たときに何の型を扱っているかが明白。
といった利点があります。
余談ですが、西森はこの書き方の名前を知らず、見つけるのに苦労しました。
クラスではどう書くの?
それではインスタンス生成ではなく、クラスのほうで総称型を見ていきたいと思います。クラスの宣言ではこんな感じになってます。
public class GenericSample<T> {
private T value;
public void setValue(T val) {
value = val;
}
public T getValue() {
return value;
}
}
コードはこちらのリンク先のものです。
Java総称型メモ(Hishidama's Java Generics Memo)
このようにクラスで仮の型をつけてあげることで、内部でもその仮の型で定義ができるわけです(コンパイル時、T型はObject型としてコンパイルされているらしい)。
実際に総称型を用いて指定した型で読み替えが行われ、その指定した型で処理が行われます。
ちなみにこのTという名前はTypeから一文字をとったようです。何を使ってもいいようですが、慣例的にTとかEが用いられているそう。
最後
関数型インターフェース調べたかったのでここらで西森は納得しましたが、上記リンクではメソッドやコンストラクタでの使い方だったり、様々なことが書いてあります。
何か型が<>で括られてるけどこれって何?どういう意味?ぐらいの初心者向けなので、それ以外の方は上記リンクをお願いします。
間違いがあったらコメントお願いします。