定義:編寫的代碼可以被不同的對(duì)象類型所重用。
泛型的本質(zhì)是參數(shù)化類型。所操作的數(shù)據(jù)類型被指定為一個(gè)參數(shù)。
比如:集合類 linkedlist
出現(xiàn):有許多原因促成了泛型的出現(xiàn),而最引人注意的一個(gè)原因,就是為了創(chuàng)建容器類。
泛型好處:
類型安全:提高java程序的類型安全,編譯時(shí)期就可以檢查出類型不正確導(dǎo)致的類型轉(zhuǎn)換異常,消除強(qiáng)制類型轉(zhuǎn)換。
泛型有三種形式:泛型類、泛型方法、泛型接口
泛型類:未知類型應(yīng)用于整個(gè)類的時(shí)候,可以使用泛型類。
class DataHolder<T>{
T item;
public void setData(T t) {
this.item=t;
}
public T getData() {
return this.item;
}
}
泛型方法:當(dāng)未知類型值應(yīng)用于方法的時(shí)候,可以使用泛型方法,類型的定義要放到返回類型或者void的前面。
/**
* 泛型方法
* @param e
*/
public <E> void PrinterInfo(E e) {
System.out.println(e);
}
泛型接口:類似于泛型類
public interface Generator<T> {
T next();
}
泛型的通配符:
<?> 無(wú)限制通配符
<? extends E> extends 關(guān)鍵字聲明了類型的上界,表示參數(shù)化的類型可能是所指定的類型,或者是此類型的子類
<? super E> super 關(guān)鍵字聲明了類型的下界,表示參數(shù)化的類型可能是指定的類型,或者是此類型的父類
泛型的類型擦除:
當(dāng)編譯器對(duì)帶有泛型的java代碼進(jìn)行編譯時(shí),它會(huì)去執(zhí)行類型檢查和類型推斷,然后生成普通的不帶泛型的字節(jié)碼,這種普通的字節(jié)碼可以被一般的 Java 虛擬機(jī)接收并執(zhí)行,這在就叫做 類型擦除(type erasure)。
擦除的實(shí)現(xiàn)原理:
Java 編輯器會(huì)將泛型代碼中的類型完全擦除,使其變成原始類型。
當(dāng)然,這時(shí)的代碼類型和我們想要的還有距離,接著 Java 編譯器會(huì)在這些代碼中加入類型轉(zhuǎn)換,將原始類型轉(zhuǎn)換成想要的類型。這些操作都是編譯器后臺(tái)進(jìn)行,可以保證類型安全。
總之泛型就是一個(gè)語(yǔ)法糖,它運(yùn)行時(shí)沒有存儲(chǔ)任何類型信息。