汎型(Generaics)略説


汎型はJDK 1.5の中で一番重要な特徴です.汎型を導入することによって、コンパイル時のタイプの安全と実行時のClass CastExceptionをより小さく打ち出す可能性が得られます.一般的なタイプはお預かりする時にタイプを指定します.取り出す時にタイプ転換をしなくてもいいです.何を預けて何を取りますか?
http://www.ibm.com/developerworks/cn/java/j-lo-gj/
汎型詳細
パンチングがない前に

package com.smallq.jdk5;

public class ObjectFoo {
	private Object foo;

	public Object getFoo() {
		return foo;
	}

	public void setFoo(Object foo) {
		this.foo = foo;
	}

	public static void main(String[] args) {
		ObjectFoo foo1 = new ObjectFoo();
		foo1.setFoo(new Boolean(true));
		
		String b=(String)foo1.getFoo();
		System.out.println(b);
	}
}

プログラムはタイプ変換の異常を投げます.

Exception in thread "main" java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.lang.String
	at com.smallq.jdk5.ObjectFoo.main(ObjectFoo.java:18)
コンパイラはあなたのプログラムに問題があると警告しません.でも、プログラムが実行されるとエラーが発生します.
汎型があったら

package com.smallq.jdk5;

public class GenericFoo<T> {
	private T foo;

	public T getFoo() {
		return foo;
	}

	public void setFoo(T foo) {
		this.foo = foo;
	}

	public static void main(String[] args) {
		GenericFoo<Boolean> foo1 = new GenericFoo<Boolean>();
		foo1.setFoo(new Boolean(true));

		Boolean b =  foo1.getFoo();
		System.out.println(b);
	}
}

foo 1のsetメソッドsetがstringであれば、コンパイル時にエラーが発生します.タイプ変換異常が発生しました.
一般的な他の特徴

package com.smallq.jdk5;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class GenericTest<T> {
	private T foo;

	public T getFoo() {
		return foo;
	}

	public void setFoo(T foo) {
		this.foo = foo;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		//     ,         ,      List        
		//          ,      ‘?’    
		//    “extends”             
		GenericTest<? extends List> foo1 = null;
		foo1 = new GenericTest<ArrayList>();
		foo1 = new GenericTest<LinkedList>();

		//             
		GenericTest<? super ArrayList> foo2 = null;
		foo2 = new GenericTest<List>();

		GenericTest<String> foo3 = new GenericTest<String>();
		foo3.setFoo("hello world");

		GenericTest<?> foo4 = null;
		foo4 = foo3;

		System.out.println(foo4.getFoo());

		foo4.setFoo(null);
		//   <?>  <? extends SomeClass>     
		//                       ,         , 
		//         ,           SomeClass   ,     
		//       ,          ,   ,          ,  
		//                ,                ,
		//             。
		//          
		// foo4.setFoo("abc");
		System.out.println(foo4.getFoo());

	}
}

package com.smallq.jdk5;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 *   extends     T      list        
 * @author smallq
 *
 * @param <T>
 */
public class ListGenericFoo<T extends List> {
	private T[] fooArray;

	public T[] getFooArray() {
		return fooArray;
	}

	public void setFooArray(T[] fooArray) {
		this.fooArray = fooArray;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ListGenericFoo<LinkedList> foo1 = new ListGenericFoo<LinkedList>();
		ListGenericFoo<ArrayList> foo2 = new ListGenericFoo<ArrayList>();
		LinkedList[] linkedList = new LinkedList[10];
		ArrayList[] arrayList = new ArrayList[10];
		
		foo1.setFooArray(linkedList);
		foo2.setFooArray(arrayList);
		
		
		ListGenericFoo<? extends List> foo3=null;
		foo3=new ListGenericFoo<ArrayList>();
		foo3=new ListGenericFoo<LinkedList>();
		//        .       List  
		//ListGenericFoo<HashMap> f=new ListGenericFoo<HashMap>();
	}

}