1. 概述
泛型在java中有很重要的地位,在面向對象編程及各種設計模式中有非常廣泛的應用。
什麼是泛型?爲什麼要使用泛型?
泛型,即“參數化類型”。一提到參數,最熟悉的就是定義方法時有形參,然後調用此方法時傳遞實參。那麼參數化類型怎麼理解呢?顧名思義,就是將類型由原來的具體的類型參數化,類似於方法中的變量參數,此時類型也定義成參數形式(可以稱之爲類型形參),然後在使用/調用時傳入具體的類型(類型實參)。
泛型的本質是爲了參數化類型(在不創建新的類型的情況下,通過泛型指定的不同類型來控制形參具體限制的類型)。也就是說在泛型使用過程中,操作的數據類型被指定爲一個參數,這種參數類型可以用在類、接口和方法中,分別被稱爲泛型類、泛型接口、泛型方法。
2. 一個栗子
一個被舉了無數次的例子:
List arrayList = new ArrayList();
arrayList.add("aaaa");
arrayList.add(100);for(int i = 0; i< arrayList.size();i++){
String item = (String)arrayList.get(i);
Log.d("泛型測試","item = " + item);
}
毫無疑問,程序的運行結果會以崩潰結束:
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
ArrayList可以存放任意類型,例子中添加了一個String類型,添加了一個Integer類型,再使用時都以String的方式使用,因此程序崩潰了。爲了解決類似這樣的問題(在編譯階段就可以解決),泛型應運而生。
我們將第一行聲明初始化list的代碼更改一下,編譯器會在編譯階段就能夠幫我們發現類似這樣的問題。
List arrayList = new ArrayList();
...
//arrayList.add(100); 在編譯階段,編譯器就會報錯
3. 特性
泛型只在編譯階段有效。看下面的代碼:
List stringArrayList =newArrayList();
List integerArrayList =newArrayList();
Class classStringArrayList = stringArrayList.getClass();
Class classIntegerArrayList = integerArrayList.getClass();
if(classStringArrayList.equals(classIntegerArrayList)){
Log.d("泛型測試","類型相同");
}
4.3 泛型類
泛型類型用於類的定義中,被稱爲泛型類。通過泛型可以完成對一組類的操作對外開放相同的接口。最典型的就是各種容器類,如:List、Set、Map。
泛型類的最基本寫法(這麼看可能會有點暈,會在下面的例子中詳解):
class 類名稱 <泛型標識:可以隨便寫任意標識號,標識指定的泛型的類型>{ private泛型標識 /*(成員變量類型)*/ var; ..... } }
一個最普通的泛型類:
//此處T可以隨便寫爲任意標識,常見的如T、E、K、V等形式的參數常用於表示泛型//在實例化泛型類時,必須指定T的具體類型publicclassGeneric{//key這個成員變量的類型爲T,T的類型由外部指定 privateT key;publicGeneric(T key) {//泛型構造方法形參key的類型也爲T,T的類型由外部指定this.key = key; }publicTgetKey(){//泛型方法getKey的返回值類型爲T,T的類型由外部指定returnkey; }}