什麼是泛型
泛型是jdk5引入的類型機制,就是將類型參數化,它是早在1999年就制定的jsr14的實現。
泛型機制將類型轉換時的類型檢查從運行時提前到了編譯時,使用泛型編寫的代碼比雜亂的使用object並在需要時再強制類型轉換的機制具有更好的可讀性和安全性。
泛型程序設計意味著程序可以被不同類型的對象重用,類似c++的模版。
泛型對於集合類尤其有用,如ArrayList。這裡可能有疑問,既然泛型為了適應不同的對象,ArrayList本來就可以操作不同類型的對象呀?那是因為沒有泛型之前採用繼承機制實現的,實際上它只維護了一個Object對象的數組。結果就是對List來說它只操作了一類對象Object,而在用戶看來卻可以保存不同的對象。
泛型提供了更好的解決辦法——類型參數,如:
List list = new ArrayList();
這樣解決了幾個問題:
1 可讀性,從字面上就可以判斷集合中的內容類型;
2 類型檢查,避免插入非法類型。
3 獲取數據時不在需要強制類型轉換。
泛型類
public class Pair{
private T field1;
}
其中 <T> 是類型參數定義。
使用時:Pair<String> p = new Pair<String>();
此時類內部的field1就是字符串類型了。
如果引用多個類型,可以使用逗號分隔:<S, D>
類型參數名可以使用任意字符串,建議使用有代表意義的單個字符,以便於和普通類型名區分,如:T代表type,有原數據和目的數據就用S,D,子元素類型用E等。當然,你也可以定義為XYZ,甚至xyZ。
泛型方法
泛型方法定義如下:
public static T marshalle(T arg){}
與泛型類一樣,<T> 是類型參數定義。如:
public class GenericMethod {
public static T getMiddle(T… a){
return a[a.length/2];
嚴格的調用方式:
String o=GenericMethod.getMiddle(「213」,」result」,」12」);
一般情況下調用時可以省略,看起來就像定義String類型參數的方法: GenericMethod.getMiddle(String,String,String),這是因為jdk會根據參數類型進行推斷。看一下下面的例子:
Object o=GenericMethod.getMiddle(「213」,0,」12」);
System.out.println(o.getClass());
System.out.println(o);
輸出結果為:
class java.lang.Integer
0
這是因為jdk推斷三個參數的共同父類,匹配為Object,那麼相當於:
習慣了類型參數放在類的後面,如ArrayList<String>,泛型方法為什麼不放在後面?看一個例子:
public static