【Java】ジェネリクスを使用して、異なるデータ型のクラスを使い分ける

■ジェネリクス

あるクラスの値をint型で作成し、同じ実装ではあるが、double型でクラスを作成したいとき、ジェネリクスを使用することで、わざわざint型のクラスとdouble型のクラスと書き分ける必要はない。

・ジェネリクスの定義方法

// ジェネリクスの定義
class クラス名<型指定>{
    クラスの処理を実装
}

// 呼び出し方
public class Sample {
	public static void main(String[] args) {
		クラス名<型指定> インスタンス名 =  new クラス名<型指定>();
    }
}

■実装するプログラムの概要

xとyの値とデータ型を出力するクラス
・フィールド宣言(メンバ変数)
 x
 y

・xとyの値とデータ型を表示するメソッド
 xの値とデータ型を出力
 yの値とデータ型を出力

・コンストラクタ
 x
 y

メインクラス
クラスをインスタンス(Integerクラス)し、xとyの値とデータ型を表示する。
クラスをインスタンス(Doubleクラス)し、xとyの値とデータ型を表示する。

※補足事項
ジェネリクスのデータ型には、int型やdouble型を指定することはできず、クラス型を指定しなければならない。
そのため、int型を指定するためには、Integerクラスを指定し、double型を指定する場合は、Doubleクラスを指定する。
この「int型」→「Integerクラス」をボクシングと呼び、「Integerクラス」のことを総じてラッパークラスと呼ぶ。

■サンプルコード

// xとyの値とデータ型を出力するクラス
class num<Type> {
	// フィールド宣言(メンバ変数)
	private Type x;
	private Type y;	
	
	// xとyの値とデータ型を表示
	public void show_num() {
		System.out.println("x = " + x);
		System.out.println("xのデータ型: " + x.getClass().getSimpleName());
		System.out.println("y = " + y);
		System.out.println("yのデータ型: " + y.getClass().getSimpleName());
	}
	
	// コンストラクタ
	public num(Type x, Type y) {
		this.x = x;
		this.y = y;
	}
}

public class Sample {

	// メイン処理
	public static void main(String[] args) {
		// クラスをインスタンス(Integerクラス)
		num<Integer> cal1 = new num<Integer>(1, 2);
		// xとyの値とデータ型を表示
		cal1.show_num();
		
		// クラスをインスタンス(Doubleクラス)
		num<Double> cal2 = new num<Double>(1.23, 4.56);
		// xとyの値とデータ型を表示
		cal2.show_num();
	}
}

■実行結果

x = 1
xのデータ型: Integer
y = 2
yのデータ型: Integer
x = 1.23
xのデータ型: Double
y = 4.56
yのデータ型: Double

コメント