(1) Javaの型とは?ジェネリクスの基本や使い方をご紹介
(1-1) <T>とは?ジェネリクスとは?
(1-2) ジェネリクスを使う利点
(1-3) ジェネリクスをクラスやメソッドで使用する方法
(1-4) サンプルプログラム
(1) Javaの型とは?ジェネリクスの基本や使い方をご紹介
(1-1) <T>とは?ジェネリクスとは?
<T>は「ジェネリクス」と呼ばれる、汎用的なクラスやメソッドの定義に使われる機能を表す記述の事で、「型パラメータ」と呼ばれています。JDK 5.0より導入されました。
宣言時点ではデータ型は<T>と未確定で、インスタンス化やメソッドに与えた引数を「型」が判断されて決まります。これを使う事で、1つのクラスやメソッドの宣言で、様々な「型」で利用する事ができます。
(図111)
(1-2) ジェネリクスを使う利点
主に次に示す目的で使用します。
①共通的なクラスやメソッド定義
複数のデータ型で使える「共通的なクラスやメソッド」を作る事ができます。
具体的な利用シーンとして、例えば「Arrayをソートするためのメソッド」を作り、様々な型(StringやIntegerやDoubleなど)でソートを利用する等が考えられます。
コンパイル時に誤ったデータ型によるインスタンス化/メソッド実行を検知できます。
(1-3) ジェネリクスをクラスやメソッドで使用する方法
まずは「クラス」でGenericsを使用する方法をご紹介します。
■構文:ジェネリクスによるクラスの宣言
クラス名の後に<T>を付けて宣言します。
class [クラス名]<T> { //[クラスの定義] }
■構文:ジェネリクスによるクラスをインスタンス化
例では<String>の記述により、このインスタンス内の<T>ではString型の引数のみが代入できるように限定しています。
[クラス名]<[データ型]> [インスタンス名] = new [クラス名]<[データ型]>(); //(例) Car<String> cname = new Car<String>();
■構文:ジェネリクスによるメソッド定義
通常、データ型(intやString)を記述する「戻り値の型」や「引数の型」で「T」を使います。
public T [メソッド名](T [引数名]) { //[メソッドの処理] }
②「型パラメータ」Tにはプリミティブ型は指定できません(「int」や「double」や「char」等)
(1-4) サンプルプログラム
最後に上記を動く形で一連のプログラムにしたものをご紹介します。
このサンプルでは「Car」というジェネリクスのクラスを定義し、それをStringやIntegerやDoubleなど様々な型で利用しています。Stringで利用する場合は「車の名前」を保持する目的で使い、Integerで利用する場合は「車の価格」を保持する目的で使い、Doubleで利用する場合は「車重」を保持する目的でインスタンス化しています。
(サンプルプログラム)
//Genericsによるクラスをテストするためのドライバークラス public class IT02xx_GenericsTest { public static void main(String args[]) { //Genericsによるクラスのインスタンス化 //(1)String型でインスタンス化 Car<String> cname = new Car<String>(); // 上記でStringを指定しているため、setTメソッドの引数はString型を与えます。 String carname = cname.setT("○○号"); System.out.println("Car name is "+carname); //(2)Integer型でインスタンス化 Car<Integer> cprice = new Car<Integer>(); // 上記でIntegerを指定しているため、setTメソッドの引数はInteger型を与えます。 Integer carprice = cprice.setT(2500000); System.out.println("Car price is "+carprice+" 円です"); //(3)Double型でインスタンス化 Car<Double> cweight = new Car<Double>(); // 上記でDoubleを指定しているため、setTメソッドの引数はDouble型を与えます。 Double carweight = cweight.setT(1625.65); System.out.println("Car weight is "+carweight+" kgです"); } } //Genericsによるクラス定義 class Car<T> { //インスタンス変数(staticなし)を型パラメータを使い宣言 private T car; //Genericsによるメソッド定義(セッターメソッド) public T setT(T car) { this.car = car; return this.car; } }
(図141)実行結果