一、概述編程
泛型在Java中有很重要的地位,在面向對象編程及各類設計模式中應用很是普遍。設計模式
泛型,即 」參數化類型「。一提到參數,最熟悉的就是定義方法時有形參,而後調用此方法時傳遞實參。那麼參數化類型怎麼理解呢?測試
就是將類型由原來的具體的類型參數化,相似於方法中的變量參數,此時類型也定義成參數形式(能夠稱之爲類型參數)。this
而後在使用/調用時傳入具體的類型(類型實參)。設計
泛型的本質是爲了參數化類型(在不建立新的類型的狀況下,經過泛型指定的不一樣類型來控制形參具體限制的類型),也就是在泛型使用過程當中,操做的數據類型被指定爲一個參數,這種參數類型能夠用在類、接口和方法中,分別被稱爲泛型類、泛型接口、泛型方法。對象
二、例子接口
List list = new ArrayList();get
list.add("aaa");編譯器
list.add(100);string
for(int i=0;i<list.size();i++){
String item = (String)list.get(i);
Log.d("泛型測試",」item = 「+item);
}
程序運行結果:會出現類型轉換異常
ArrayList能夠存聽任意類型,例子中添加了一個String類型,添加了一個Integer類型,再使用時都以String的方式使用,所以程序奔潰了,爲了解決相似這樣的問題(在編譯階段就能夠解決),泛型應用而生。
咱們將第一行聲明初始化list的代碼更改一下,編譯器會在編譯階段就可以幫助咱們返現相似的問題。
List<String> arrayList = new ArrayList<String>();
//arrayList.add(100);在編譯階段,編譯器就會報錯。
三、特性
泛型只在編譯階段有效。
List<String> stringArrayList = new ArrayList<String>();
List<Integer> integerArrayList = new ArrayList<Integer>();
Class classStringArrayList = stringArrayList.getClass();
Class classIntegerArrayList = integerArrayList.getClass();
if(classStringArrayList.equals(classIntegerArrayList)){
Log.d("泛型測試",」類型相同「);
}
輸出結果:D/泛型測試:類型相同。
經過上面的例子能夠證實:在編譯以後程序會採起去泛型化的措施,也就是說Java中的泛型,只在編譯階段有效。在編譯過程當中,正確校驗泛型結果後,會將泛型的相關信息擦出,而且在對象進入和離開方法的邊界處添加類型檢查和類型轉換的方法,也就是說,泛型信息不會進入到運行時階段
總結:泛型類型在邏輯上看似當作是多個不一樣的類型,實際上都是相同的基本類型
四、泛型的使用
泛型有三種使用方式,分別是:泛型類、泛型接口、泛型方法
4.三、泛型類
泛型類型用於類的定義中,被稱爲泛型類。經過泛型能夠完成對一組類的操做對外開放相同的接口。最典型的就是各類容器類,如:List、Set、Map
泛型類的最基本用法:
class 類名稱<泛型標識:能夠隨便寫任意標識號,標識指定的泛型的類型>{
private 泛型標識 /*成員變量類型*/ var;
}
一個普通的泛型類:
//此處T能夠隨便寫爲任意標識,常見的如T、E 、K 、V等形式的參數經常使用於表示泛型
在實例化泛型類時,必須指定T的具體類型
public class Generic<T>{
//key這個成員變量的類型爲T,T的類型由外部指定。
private T key;
public Generic(T key){
//泛型構造方法形參key的類型也爲T,T的類型由外部決定
this.key = key;
}
public T getKey(){
//泛型方法getKey的返回值類型爲T,T的類型由外部指定
return key;
}
}
//泛型的類型參數只能是類類型包括自定義類),不能是簡單類型
//傳入的實參類型需與泛型的類型參數類型相同,即爲Integer。
Generiv<Integer> genericInteger = new Generic<Integer>(123456);