【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

ポイント

  1. 9行目と15行目でString型とInteger型を持ったTestGenericsを作っています。
  2. 11行目と17行目で、同じTestGenericsクラスが持っているsetT(〜〜)のメソッドを使っているのに、
    引数がジェネリクスで指定した型になっている
  3. 12行目と19行目で、同じTestGenericsクラスが持っているgetT()のメソッドを使っているのに、
    戻り値が、ジェネリクスで指定した型になっている
                    

まとめ

今回は初心者や、入門者がイメージつきづらいところを
なるべくイメージしやすいように書きました。

プログラムの覚え方は人それぞれだと思います。
最初からしっかり理解しなきゃいけない、という意見もあると思いますが
こういう覚え方でやるのもありかと思います。

自分がしっかり理解して、吸収できる覚え方であれば、
手段は一つじゃないと思いました。

今回は以上!!!

スポンサーリンク