ジェネリクスを使用したクラスを利用するだけでなく、ジェネリクスを使用したクラスを自作することもできます。以下のプログラムでは、ジェネリクスを使用して 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型インスタンスも格納できていることが分かります。