2005.10.31 株式会社四次元データ CTO 畠中晃弘
Java言語機能(JDK5.0(Tiger)新機能) 1章 ジェネリクス
- 1.1. ジェネリクスとは
- 1.2. ジェネリックなクラス・インタフェースの作成
- 1.3. 型引数
- 1.4. ジェネリクスなクラス・インタフェースの利用
1.2. ジェネリックなクラス・インタフェースの作成
Genericsを用いたクラスを「ジェネリックなクラス」、インタフェースを「ジェネリックなインタフェース」と呼びます。 まずジェネリックなクラス・インタフェースの作成方法について説明します。 先ほどの例で登場したjava.util.List, java.util.LinkedListを例に説明します。
public interface List<E> extends Collection<E>{ public boolean add(E object); public E get(int index); ...
上記はjava.util.Listの一部を抜き出したものです。 ListおよびCollectionに続いて<E>と、これまでには無かった記法が見られます。 <>で囲まれている部分を「型引数」と呼び、型を引数(パラメータ)として受け取る部分を表します。 メソッドの引数に対応するものと考えれば良いでしょう。 <>内に記載するEは変数で、「型変数」と呼びます。型そのものが格納される変数と考えてください。 このEがadd()メソッドの引数、およびget()メソッドの返り値として使用されています。 つまり型変数に指定された型のオブジェクトを引数として取る、型変数に指定された型のオブジェクトを返り値として返すことを意味しています。
前節のサンプルでは、
List<String> listとなっていましたので、EにはStringが代入されることになります。つまり先ほどのインタフェース宣言は
public interface List<String> extends Collection<String>{ public boolean add(String object); public String get(int index); ...と解釈できることになります。 このためList<String>型のオブジェクトにはStringしか追加できず、また取り出すオブジェクトもString限定ということになります。
一方、LinkedListは次のようになっています。
public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Queue<E>, Cloneable, Serializable{ public boolean add(E object){ ... public E get(int index){ ...
前節のサンプルでは、
new LinkedList<String>
となっていましたので、こちらは
public class LinkedList<String> extends AbstractSequentialList<String> implements List<String>, Queue<String>, Cloneable, Serializable{ public boolean add(String object){ ... public String get(int index){ ...
と解釈できます。