【Java・初心者向け】ジェネリクス(総称型)のTの部分の意味
この記事を書こうと思ったきっかけ
仕事していたら、後輩君から以下のような質問がきました
後輩君「ジェネリクスで定義できるクラスなんですけど、このクラスに書かれている『T』ってなんですか?」
僕「List型の変数を宣言するとき『<String>』ってつけるよね。でも<>の中ってIntegerでも、
Beanクラスでも定義できるよね。
クラスを作った時は、仮の引数として…」
後輩君「は・・・はぁ・・・」
なかなか意味が難しくて、最初から全てを理解しようとして頭がパンクしたようです。
最初はニュアンスで伝える方法が必要ではないかと思いました。
最初から理解できる人もいれば、ニュアンスで覚えてから使って、理解するという人もいます。
今回はニュアンスで覚えていくやり方を書いていこうと思います。
ジェネリクスのTの部分は変数宣言されて初めて力を発揮する
ジェネリクスを持った以下のクラスを定義しました。
package jp.co.test.tatsunoko;
public class TestGenerics<T> {
private T pClass;
public T getT() {
return pClass;
}
public void setT(T clazz) {
this.pClass = clazz;
}
}
このクラス内全ての「T」というのはクラスを作った時は、
まだどんなクラスかわからない状態になります。
ただ、仮として定義してあげているだけの状態です。
(作った時というのは、
変数宣言じゃなくて、Javaファイルを作ったときと覚えておけばOK)
上記のTestGenerics型のクラスを変数宣言した時、
<String>
を指定してあげると
宣言した変数の持っているTの型は初めて全て「String型」になるのです。
※中には「E」で書いている人もいますが、よく見るのがTなのでTで説明します。
実はEだろうが、TだろうがIだろうがなんでも良いのです。
以上…
と、これだけじゃわからないと思います。
なのでサンプルソースを作りました。
ジェネリクスのTを使ったサンプル
ジェネリクスを持ったクラス
package jp.co.test.tatsunoko;
public class TestGenerics<T> {
private T pClass;
public T getT() {
return pClass;
}
public void setT(T clazz) {
this.pClass = clazz;
}
}
TestGenerics
package jp.co.test.main;
import jp.co.test.tatsunoko.TestGenerics;
public class TestMain {
public static void main(String[] args) {
TestGenerics<String> testGeneString = new TestGenerics<>();
String testStr = "String型で指定した総称型です";
testGeneString.setT(testStr);
String testStr2 = testGeneString.getT();
System.out.println(testStr2);
TestGenerics<Integer> testGeneInteger = new TestGenerics<>();
Integer testInteger = 10;
testGeneInteger.setT(testInteger);
Integer testInteger2 = testGeneInteger.getT();
System.out.println(testInteger2);
}
}
コンソールの表示結果 |
---|
String型で指定した総称型です 10 |
ポイント
- 9行目と15行目でString型とInteger型を持ったTestGenericsを作っています。
- 11行目と17行目で、同じTestGenericsクラスが持っているsetT(〜〜)のメソッドを使っているのに、
引数がジェネリクスで指定した型になっている - 12行目と19行目で、同じTestGenericsクラスが持っているgetT()のメソッドを使っているのに、
戻り値が、ジェネリクスで指定した型になっている
まとめ
今回は初心者や、入門者がイメージつきづらいところを
なるべくイメージしやすいように書きました。
プログラムの覚え方は人それぞれだと思います。
最初からしっかり理解しなきゃいけない、という意見もあると思いますが
こういう覚え方でやるのもありかと思います。
自分がしっかり理解して、吸収できる覚え方であれば、
手段は一つじゃないと思いました。
今回は以上!!!
ディスカッション
コメント一覧
まだ、コメントがありません