ジェネリクスを使用したクラスを利用するだけでなく、ジェネリクスを使用したクラスを自作することもできます。以下のプログラムでは、ジェネリクスを使用して 1個のインスタンスを格納できる Boxクラスを作成して、メインメソッドでそれを利用してみました。
なお、拡張 for文を使用しています。また、この Boxクラスはサンプルコードの意味合いが強く、実用性はあまりありません。
ソースコードは以下の通り。
V701/Box.java
/**
* インスタンスを格納するクラスです。
* @param <T> 型
*/
public class Box<T> {
/**
* 格納するオブジェクト。
*/
private T object;
/**
* コンストラクタ。
* @param object オブジェクト
*/
public Box(T object) {
this.object = object;
}
/**
* 格納されたオブジェクトを返します。
* @return オブジェクト
*/
public T get() {
return this.object;
}
}
V701/V701.java
import java.awt.Point;
import java.util.ArrayList;
import java.util.List;
/**
* ジェネリクスを使用したクラスを作成し、利用します。
*/
public class V701 {
/**
* メインメソッド。
* @param args 引数
*/
public static void main(String[] args) {
// String型インスタンスを格納する Box
Box<String> stringBox = new Box<>("ABCDE");
String string = stringBox.get();
System.out.println(string);
// Point型インスタンスを格納する Boxのリスト
List<Box<Point>> pointBoxes = new ArrayList<>();
pointBoxes.add(new Box<>(new Point(10, 20)));
pointBoxes.add(new Box<>(new Point(50, 90)));
pointBoxes.add(new Box<>(new Point(40, 30)));
// 拡張 for文を使用するとよりスマートに記述できる
for(int i = 0; i < pointBoxes.size(); i++) {
Box<Point> pointBox = pointBoxes.get(i);
Point point = pointBox.get();
System.out.println(point);
}
}
}
実行結果の例は以下の通り。
ABCDE java.awt.Point[x=10,y=20] java.awt.Point[x=50,y=90] java.awt.Point[x=40,y=30]
それぞれのBox型インスタンスに、String型インスタンスも Point型インスタンスも格納できていることが分かります。