一簇搅、泛型類(lèi)和泛型接口
1.如果定義了泛型類(lèi),實(shí)例化沒(méi)有指明類(lèi)的泛型贾节,則認(rèn)為此泛型類(lèi)型為Object類(lèi)型火欧。
2.要求:如果大家定義了類(lèi)帶了泛型的,建議在實(shí)例化時(shí)要指明類(lèi)的泛型振劳。
3.由于子類(lèi)在繼承帶泛型的父類(lèi)時(shí)椎组,如果父類(lèi)指明了泛型類(lèi)型。則實(shí)例化子類(lèi)對(duì)象時(shí)历恐,不再需要指明泛型寸癌。子類(lèi)不是泛型類(lèi)。
public class SubOrder extends Order<Integer> {
}
4.由于子類(lèi)在繼承帶泛型的父類(lèi)時(shí)弱贼,如果父類(lèi)不指明泛型類(lèi)型蒸苇。是泛型類(lèi)(例:ArrayList)
public class SubOrder1<T> extends Order<T> {
}
1.泛型類(lèi)可以有多個(gè)參數(shù),此時(shí)應(yīng)將多個(gè)參數(shù)一起放在尖括號(hào)內(nèi)吮旅。比如:<E1,E2,E3>
2.泛型類(lèi)的構(gòu)造器如下:public GenericClass() {},錯(cuò)誤的是public GenericClass<E>() {}
3.實(shí)例化后溪烤,操作原來(lái)泛型位置的結(jié)構(gòu)必須與指定的泛型類(lèi)型一致。
4.泛型不同的引用不能相互復(fù)制庇勃。
5.泛型如果不指定檬嘀,將被擦除,泛型對(duì)應(yīng)類(lèi)型均按照Object處理责嚷,但不等價(jià)與Object鸳兽。經(jīng)驗(yàn):泛型要使用一路都用。要不用罕拂,一路都不要用揍异。
6.如果泛型結(jié)構(gòu)是一個(gè)接口或抽象類(lèi),則不可以創(chuàng)建泛型類(lèi)的對(duì)象爆班。
7.jdk1.7衷掷,泛型的簡(jiǎn)化操作:ArrayList<Fruit> flist = new ArrayList<>();
8.泛型的指定中不能使用基本數(shù)據(jù)類(lèi)型,可以使用包裝類(lèi)替換柿菩。
9.在類(lèi)/接口上聲明的泛型棍鳖,在本類(lèi)或本接口中即代表某種類(lèi)型,可以作為非靜態(tài)屬性的類(lèi)型碗旅,非靜態(tài)方法的參數(shù)類(lèi)型渡处,非靜態(tài)防范的返回值類(lèi)型,但在靜態(tài)方法中不能使用類(lèi)得泛型祟辟。
10.異常類(lèi)不能是類(lèi)的泛型
11.不能使用new E[]医瘫。但是可以: E[] elements = (E[])new Object[capacity]; 參考:ArrayList源碼中聲明:Object[] elementData,而非泛型參數(shù)類(lèi)型數(shù)組旧困。
12.父類(lèi)有泛型醇份,子類(lèi)可以選擇保留泛型也可以選擇指定泛型類(lèi)型:
子類(lèi)不能保留父類(lèi)的泛型:按需實(shí)現(xiàn)
沒(méi)有類(lèi)型 擦除
子類(lèi)保留父類(lèi)的泛型:泛型子類(lèi)
全部保留
部分保留
結(jié)論:子類(lèi)必須是“富二代”稼锅,子類(lèi)除了指定或保留父類(lèi)的泛型,還可以增加自己的泛型僚纷。
二矩距、泛型方法
泛型方法:在方法中出現(xiàn)了泛型的結(jié)構(gòu),泛型參數(shù)與類(lèi)得泛型參數(shù)沒(méi)有任何關(guān)系怖竭。
泛型方法可以聲明為靜態(tài)的锥债,原因:泛型參數(shù)是在調(diào)用方法的時(shí)候確定的,并不是實(shí)例化類(lèi)時(shí)確定的痊臭。
//泛型參數(shù)
public <E> List<E> copyFromArrayToList(E[] arr) {
}
三哮肚、泛型在繼承方面的體現(xiàn)
泛型在繼承方面的體現(xiàn)
雖然類(lèi)A是類(lèi)B的父類(lèi),但是G<A>和 G<B>二者不具備子父類(lèi)關(guān)系广匙,二者是并列關(guān)系允趟。
補(bǔ)充:類(lèi)A是類(lèi)B的父類(lèi),A<G>是B<G>的父類(lèi)
//如下代碼:這種寫(xiě)法時(shí)錯(cuò)誤的鸦致,此時(shí)list1(List<Object> )和list2(List<String> )的類(lèi)型不具又子父類(lèi)關(guān)系潮剪。雖然Object是String的父類(lèi)。
List<Object> list1 = null;
List<String> list2 = null;
list1 = list2
證明反證法: list1=list2分唾;假設(shè)list1=list2鲁纠,list1.add(123);導(dǎo)致非String的數(shù)據(jù)混入。出錯(cuò)
四鳍寂、通配符的使用
類(lèi)A是類(lèi)B的父類(lèi),但是G<A>和 G<B>二者沒(méi)有關(guān)系情龄,G<?>是G<A>和 G<B>的父類(lèi)
對(duì)于List<?>就不能向其內(nèi)部添加數(shù)據(jù)了,除了添加null之外迄汛。
List<Object> list1 = null;
List<String> list2 = null;
List<?>
list1 = list2