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