====基本事項====
<> <> で囲まれた型は、ジェネリックス型、ジェネリックス型が適用された型をベース型。
{|class="wikitable"
// List, ArrayList はベース型、Deriv はジェネリックス型
// ジェネリックス型に、多態性は適用されない
// ArrayList<<Number> > l = new ArrayList<<Integer>>(); //NG (2) List<<Integer> > l2 = new ArrayList<<Integer>>(); //OK
// 当然ながら、保持する要素レベルでは多態性は利用できる(3)
List<<Number> > l3 = new ArrayList<<Number>>();
l3.add(new Integer(1));
l3.add(new Long(2));
*多態性を利用して、統一的に処理を行いたい(基底クラスが提供するメソッドを呼び出したい等)場合は、ワイルドカード+extendを利用する。(1)
*引数型を、List<<? extend Clazz> > とすることで、 IS-A Cazz にパスする任意のジェネリックス型のリストを渡すことができる。
*ただし、このリストに要素を追加することはできない。(実際の型が何であるか不明)(2)
*削除操作などは可能。(3)
public static void main(String[] args) {
GenericsTest2 me = new GenericsTest2();
List<<Integer> > l1 = new ArrayList<<Integer>>(); List<<Long> > l2 = new ArrayList<<Long>>();
l1.add(new Integer(1));
}
public void printNames(List<<? extends Number> > lst) { // ワイルドカードの使用 (1)
// lst.add(this.new Base("B-1")); // リストに追加する操作は、コンパイルエラー (2)
lst.remove(1); // 削除する操作は、OK (3)
* ? + extends とは逆に、多態性を利用して、基底クラスの参照に、派生クラスを格納したいような場合は、ワイルドカード+superを利用する。(1)
* 引数型を、List<<? super Clazz> > とすることで、Cazz IS-A ? にパスする任意のジェネリックス型のリストを渡すことができる。(2)
* 渡された側では、ジェネリックス型に代入互換性があるクラスを追加することができる。
public static void main(String[] args) {
GenericsTest3 me = new GenericsTest3();
List<<Base> > baselst = new ArrayList<<Base>>(); List<<Deriv> > drvlst = new ArrayList<<Deriv>>(); List<<Deriv_1> > drvlst_1 = new ArrayList<<Deriv_1>>(); List<<Deriv_2> > drvlst_2 = new ArrayList<<Deriv_2>>(); List<<Deriv_1_1> > drvlst_1_1 = new ArrayList<<Deriv_1_1>>();
me.putObject(baselst); // OK Base に Deriv_1 は代入可能(2)
}
public void putObject(List<<? super Deriv_1> > lst) { // (1)
Base base = this.new Base();
Deriv drv = this.new Deriv();
====インスタンスを生成する====
public <<T> > T createInstance(Class<<T> > cls) {
return cls.newInstance();
}