PR

 ジェネリクスは,C#やJavaなどのオブジェクト指向言語でクラスやメソッドを定義する際に,それらが処理対象とするデータ型を特定せず,パラメータとして定義できる機能です。

 C#は2005年11月にリリースされたC# 2.0(Visual C# 2005に搭載)から,Javaは2004年9月にリリースされたJava SE 5.0から,それぞれジェネリクスをサポートしています。

 ジェネリクスの典型的な利用例は,複数のオブジェクトをまとめて保持する「コレクション」クラスの実装です。例えばC#やJavaの標準ライブラリは,リスト・クラスを,ジェネリクスを使ったList<T>クラスとして提供しています。

 List<T>クラスの“T”が,このリストに格納できるオブジェクトの型を表すパラメータで,実際にリストの変数やインスタンスを生成するときに指定します。例えばStringオブジェクトのリストを使いたい場合には,パラメータTをStringとして

List<String> list
= new List<String>();
といったコードでStringオブジェクトのリストを作れます。

 String以外の任意のクラスでも同じリスト・クラスのコードを再利用可能です。しかも実行時には処理対象の型が特定されるので,型の安全性も確保されます。ジェネリクスが使えない環境でこのようなリスト・クラスを実現しようとすると,クラスを定義する時点で,格納できるオブジェクトのクラスを決めなければならないので,コードの再利用性か型の安全性のいずれかが損なわれます。

 つまり,対象を特定のクラスに限定すれば,その場では問題なく使えますが,別のクラス向けのリスト・クラスを作るためには,同じアルゴリズムのコードを新しいクラス向けに書かなければなりません。

 一方,Objectクラスなどクラス階層の上位にあるクラスを格納できるようにすれば,どんなオブジェクトでも格納できる汎用のリストになり,再利用時にコードを書き直す必要はなくなります。しかし,格納されたオブジェクトはすべてObjectクラスのインスタンスとして扱われます。そこから取り出したオブジェクトを処理するには明示的な型変換が必要になり,型の安全性が損なわれます。