1. ジェネリクス
2005.10.31 株式会社四次元データ CTO 畠中晃弘
Java言語機能(JDK5.0(Tiger)新機能) 1章 ジェネリクス
- 1.1. ジェネリクスとは
- 1.2. ジェネリックなクラス・インタフェースの作成
- 1.3. 型引数
- 1.4. ジェネリクスなクラス・インタフェースの利用
1.1. ジェネリクスとは
ジェネリクスとは、「総称性(Genericity)」「ジェネリック・プログラミング」とも呼ばれるプログラミング技法で、 オブジェクト指向とは異なるパラダイムからきたものです。 データの型に束縛されず、型そのものをパラメータ化して扱うことができます。
Javaでは主にコレクションクラスに導入されています。 まずJava Genericsの感じをつかんでもらうために、Genericsを用いた場合のプログラムと用いなかった場合のプログラム例を以下に示します。 最初にGenericsを用いなかった場合のプログラム例を示します。 プログラム引数の値を1つずつListに格納し、またListの値を1つずつ取り出して標準出力に出力しています。
Genericsを用いなかった場合
import java.util.LinkedList; import java.util.List; public class NoGenericsSample { public static void main(String[] args) { List list = new LinkedList(); for (int i = 0; i < args.length; i++) { list.add(args[i]); } for (int i = 0; i < list.size(); i++) { String text = (String) list.get(i); System.out.println(text); } } }
java.util.Listはどのような型のオブジェクトも格納できるコレクションです。 利点でもあるのですが、
- 格納できるオブジェクトの型を限定できない
- 限定できないためにget()メソッドで取り出す際に、キャストしなければならない
という欠点を抱えています。
Genericsを用いた場合
import java.util.LinkedList; import java.util.List; public class GenericsSample { public static void main(String[] args) { List<String> list = new LinkedList<String>(); for (int i = 0; i < args.length; i++) { list.add(args[i]); } for (int i = 0; i < list.size(); i++) { String text = list.get(i); System.out.println(text); } } }
Listを作成する際、<>の中にStringを指定して作成しています。 詳細は後述しますが、このようにしてStringのみを格納できるListを作成しています。 Stringに限定されているため、add()メソッドでListに追加できるオブジェクトはStringのみになり、 get()メソッドで返されるオブジェクトもStringのみとなります。
Genericsの雰囲気は伝わったでしょうか。 以降、Genericsを用いたクラス・インタフェースの作成からその利用まで詳しく説明していきます。