背景
Java推出泛型以前,程序員可以通過構(gòu)建一個(gè)元素類型為Object的集合,改集合能夠存儲(chǔ)任意的數(shù)據(jù)類型對(duì)象,而在使用該集合的過程中,程序員明確知道存儲(chǔ)的每個(gè)元素類型,否則很容易引起ClassCastException異常
泛型學(xué)習(xí)結(jié)構(gòu)圖

一、泛型的概述
Java泛型 是JDK5中引入的一個(gè)新特性,泛型提供了編譯時(shí)類型安全監(jiān)測機(jī)制,該機(jī)制允許我們?cè)诰幾g檢測到非法的類型數(shù)據(jù)結(jié)構(gòu)。
泛型的本質(zhì)就是參數(shù)化類型,也就是所操作的數(shù)據(jù)類型被指定為一個(gè)參數(shù)。
這里解釋一下兩個(gè)詞:
1、編譯時(shí)類型安全監(jiān)測機(jī)制:
ArrayList<String> strList = new ArrayList<>()
strList.add("1");//這里不會(huì)出錯(cuò),
strList.add ( 1 ); //這里會(huì)無法添加,編譯時(shí)報(bào)錯(cuò)。
2、參數(shù)化類型:
指的就是將類型,當(dāng)做參數(shù),如ArrayList<String>,或者ArrayList<User> 這里將String類型,User類型,當(dāng)做參數(shù),傳遞給ArrayList
二、泛型類
1、泛型類的定義語法
class 類名稱 <泛型標(biāo)識(shí),泛型標(biāo)識(shí),.....>{
private 泛型標(biāo)識(shí)? 變量名
}
2、常用的泛型標(biāo)識(shí):T、E、K、V
3、注意:
泛型不支持基本數(shù)據(jù)類型,只能是類型,因?yàn)榉盒蜁?huì)先轉(zhuǎn)化成Object類,再在適當(dāng)?shù)臅r(shí)候,轉(zhuǎn)化成對(duì)應(yīng)的類型。
同一泛型類,根據(jù)不同的數(shù)據(jù)類型創(chuàng)建對(duì)象,本質(zhì)上是同一類型(泛型類類型)地址是相同位置。如:ArrayList<User> 和 ArrayList<Person> 本質(zhì)上都是ArrayList。
如果子類是泛型類,子類和父類泛型保持一致。如果子類不是泛型類,那么父類要明確泛型類型。
三、泛型方法
1、泛型方法的定義語法
權(quán)限修飾符 <T,K,H>? 返回類型? 方法名 (T t,K k, H h) {? 方法體 }

四、泛型接口
1、泛型接口的定義語法:
權(quán)限修飾符?interface?接口名稱 <T> { }
2、注意:
2.1?實(shí)現(xiàn)類不是泛型類,泛型接口要明確類型
2.2?實(shí)現(xiàn)類是泛型類,泛型接口要和實(shí)現(xiàn)類保持一致
解釋如下:


五、泛型通配符
類型通配符一般是使用?代替具體的類型實(shí)參。這里就把?當(dāng)成特別的一種類,是所有類型的父類。

1、類型通配符的上限
即類型傳入的實(shí)參,必須是指定類型的子類型。

2、類型通配符的下限
即類型傳入的實(shí)參,必須是指定類型的父類

兩者的區(qū)別,一個(gè)是 extends ,一個(gè)是 super
六、泛型擦除
Java語言的泛型采用的是擦除法實(shí)現(xiàn)的偽泛型,泛型信息(類型變量、參數(shù)化類型)編譯之后通通被除掉了。使用擦除法的好處就是實(shí)現(xiàn)簡單、非常容易Backport,運(yùn)行期也能夠節(jié)省一些類型所占的內(nèi)存空間。而擦除法的壞處就是,通過這種機(jī)制實(shí)現(xiàn)的泛型遠(yuǎn)不如真泛型靈活和強(qiáng)大,泛型類型只有在靜態(tài)類型檢查期間才出現(xiàn),在此之后,程序中的所有泛型類型都將被擦除,替換成它們非泛型上界。
七、泛型與數(shù)組
1、在java中是”不能創(chuàng)建一個(gè)確切的泛型類型的數(shù)組”的,但是如果使用泛型通配符是可以的,如下:


八、總結(jié)
在實(shí)際的編程過程中,自己可以使用泛型去簡化開發(fā),且能很好的保證代碼質(zhì)量