一、泛型的基本概念
1疤估、概述
泛型的本質(zhì):參數(shù)化類(lèi)型,也就是說(shuō)所操作的數(shù)據(jù)類(lèi)型被指定為一個(gè)參數(shù)霎冯,在用到的時(shí)候再指定具體的類(lèi)型铃拇。
Java語(yǔ)言中的泛型只在源碼中存在,在編譯后的字節(jié)碼文件中沈撞,就已經(jīng)被替換為原來(lái)的原始類(lèi)型了慷荔,并且在相應(yīng)的地方插入了強(qiáng)制轉(zhuǎn)型代碼,因此對(duì)于運(yùn)行期的Java語(yǔ)言來(lái)說(shuō)缠俺,ArrayList<int>與ArrayList<String>就是同一個(gè)類(lèi)显晶。所以說(shuō)泛型技術(shù)實(shí)際上是Java語(yǔ)言的一顆語(yǔ)法糖,基于這種方法實(shí)現(xiàn)的泛型被稱(chēng)為偽泛型壹士。泛型提供了更好的安全性和可讀性吧碾。
2、基本術(shù)語(yǔ)
泛型類(lèi)型:整個(gè)成為ArrayList<E>
類(lèi)型變量或者類(lèi)型參數(shù):ArrayList<E>中的 E
參數(shù)化的類(lèi)型:整個(gè)ArrayList<Integer>
類(lèi)型參數(shù)的實(shí)例:ArrayList<Integer>中的Integer
原始類(lèi)型:ArrayList
二墓卦、泛型的使用
泛型的參數(shù)類(lèi)型可以用在類(lèi)倦春、接口和方法的創(chuàng)建中,分別稱(chēng)為泛型類(lèi)落剪、泛型接口和泛型方法睁本。
1、泛型類(lèi)的定義
class Pair<T,U> {
...
}
2忠怖、泛型接口的定義
interface Show<T,U>{
void show(T t,U u);
}
3呢堰、泛型方法的定義
public static <T, U> T get(T t, U u) {
...
}
三、泛型變量的類(lèi)型限定
有的時(shí)候凡泣,類(lèi)枉疼、接口或方法需要對(duì)類(lèi)型變量加以約束⌒猓看下面的例子:
public static <T> T get(T t1,T t2) {
if(t1.compareTo(t2)>=0);//編譯錯(cuò)誤
return t1;
}
因?yàn)槁钗诰幾g之前,也就是我們還在定義這個(gè)泛型方法的時(shí)候贺纲,我們并不知道這個(gè)泛型類(lèi)型T航闺,到底是什么類(lèi)型,所以,只能默認(rèn)T為原始類(lèi)型Object潦刃。所以它只能調(diào)用來(lái)自于Object的那幾個(gè)方法侮措,而不能調(diào)compareTo方法」愿埽可我的本意就是要比較t1和t2分扎,怎么辦呢?這個(gè)時(shí)候胧洒,就要使用類(lèi)型限定畏吓,對(duì)類(lèi)型變量T設(shè)置限定來(lái)做到這一點(diǎn)。
我們知道略荡,所有實(shí)現(xiàn)Comparable接口的方法,都會(huì)有compareTo方法歉胶。所以汛兜,可以對(duì)<T>做如下限定:
public static <T extends Comparable> T get(T t1,T t2) { //添加類(lèi)型限定
if(t1.compareTo(t2)>=0);
return t1;
}
類(lèi)型限定在泛型類(lèi)、泛型接口和泛型方法中都可以使用通今,不過(guò)要注意下面幾點(diǎn):
- 不管限定是類(lèi)還是接口粥谬,統(tǒng)一都使用關(guān)鍵字 extends(super)
- 可以使用&符號(hào)給出多個(gè)限定,比如
public static <T extends Comparable&Serializable> T get(T t1,T t2)
- 如果限定既有接口也有類(lèi)辫塌,那么類(lèi)必須只有一個(gè)漏策,并且放在首位置
public static <T extends Object&Comparable&Serializable> T get(T t1,T t2)
- 類(lèi)型通配符:? 表示任何類(lèi)型
void deal(List<? extends T> list)
- A是B的子類(lèi),則A[ ] 是 B[ ]的子類(lèi)臼氨,但是List<A>不是List<B>的子類(lèi)