泛型
前言
在沒有泛型之前埃元,程序員必須使用Object編寫適用于多種類型的代碼氢哮。很繁瑣,也不安全默垄。
泛型的引入使Java有了一個很強(qiáng)的類型系統(tǒng),允許設(shè)計者詳細(xì)地描述變量和方法的類型要如何變化甚纲。
在普通的情況下口锭,實現(xiàn)泛型代碼很容易。在更高級的情況下介杆,我們的目標(biāo)是提供讓其他程序員可以輕松使用的類和方法鹃操,這對實現(xiàn)者來說會非常復(fù)雜。
為什么要使用泛型
用泛型編寫的代碼可以對多種不同對象的類型進(jìn)行重用春哨。
沒有泛型之前荆隘,使用Object(繼承)實現(xiàn)不同類型對象間的匹配。這種方法有兩個弊端
獲取一個值時必須進(jìn)行強(qiáng)制轉(zhuǎn)換(繁瑣)
編譯期沒有錯誤檢查(不安全)
因此赴背,泛型提供了一種解決方案:類型參數(shù)(type parameter)椰拒。
使代碼更具有可讀性。
編譯器也可以充分利用這個類型信息凰荚。調(diào)用get的時候不需要強(qiáng)制轉(zhuǎn)換燃观。編譯器還知道add方法有一個類型為String的類型參數(shù),這比Object類型要安全”闵現(xiàn)在缆毁,編譯器可以檢查,防止你插入錯誤類型的對象到涂。編譯期出現(xiàn)錯誤比運行期出現(xiàn)類的強(qiáng)制轉(zhuǎn)換異常要好的多脊框。
泛型類
有一個或多個類型變量的類颁督。
例如:定義一個類型變量T,用 <> 括起來浇雹,放在類名后邊适篙。泛型類還可以有多個類型變量,<T, U>箫爷。
變量類型可以應(yīng)用于方法的返回值類型以及字段和局部變量嚷节。
使用具體的類型替換類型變量來實例化反省類型,可以把結(jié)果想像成一個普通類虎锚。
泛型方法
泛型方法可以定義在普通類中硫痰,也可以定義在泛型類中。
注意窜护,泛型變量要放在方法返回值前效斑。
調(diào)用泛型方法的方式(例子是調(diào)用靜態(tài)方法):
ArrAlg.<String>getMiddle(); 注意調(diào)用格式
ArrAlg.getMiddle(); 簡單調(diào)用
類型變量的限定
場景:某個方法參數(shù)為泛型T,在方法體中要調(diào)用compareTo方法來比較大小柱徙,既然使用了泛型缓屠,說明該方法可以傳入任何參數(shù)對象,那么如何知道T所屬的類有一個compareTo方法呢护侮?
解決這個問題的方法就是限制T只能是實現(xiàn)了Comparable接口的類敌完。可以通過對變量類型T設(shè)置一個限定來實現(xiàn)這一點: public static <T extends Comparable> T min(T[] t)
此時羊初,在調(diào)用泛型方法min時只能傳遞實現(xiàn)了Comparable接口的類型對象的參數(shù)滨溉。
語法就是: <T extends BoundingType> ,T和限定類可以是類也可以是接口长赞。
一個類型變量或通配符可以有多個限定:
類型變量用 逗號 分隔
<T, U extends Comparable>
限定類型用 & 分隔
<T extends Comparable & Serializable>
注意:可以限定多個接口晦攒,類最多只能限定一個。如果有一個類作為限定得哆,這個類必須是第一個限定脯颜。
泛型代碼和虛擬機(jī)
無論何時定義一個泛型,都會自動提供一個原始類型(raw type)贩据。這個原始類型就是去掉類型參數(shù)后的泛型類型名栋操。對于無限定的變量替換為Object。
原始類型第一個限定類型來替換類型變量乐设,如果沒有給定限定讼庇,則替換為Object。例如:
public class Interval<T extends Comparable & Serializable> {
private T lower;
}
// Comparable為第一個限定類型近尚,所以使用它來替換
public class Interval {
private Comparable lower;
}
泛型轉(zhuǎn)換的步驟
對原始方法Pair.getFirst調(diào)用返回Object類型
將返回的Object類型轉(zhuǎn)換為Employee類型
泛型轉(zhuǎn)換規(guī)則
虛擬機(jī)中沒有泛型蠕啄,只有普通的類和方法
所有的類型參數(shù)都會替換為他們的限定類型
會合成橋方法來保持多態(tài)
為保持類的安全性,必要時會插入強(qiáng)制類型轉(zhuǎn)換
@SuppressWarnings("unchecked")
這個注解會關(guān)閉代碼檢查
泛型的限制與局限性
泛型不能使用基本數(shù)據(jù)類型
類型比較只適用于原始類型
不能創(chuàng)建泛型數(shù)組
通配符
泛型通配符搭配集合使用一般在方法的參數(shù)中比較常見
方法中的參數(shù)是一個集合,集合如果攜帶了通配符,要特別注意如下:
1 集合的類型會提升為Object類型歼跟。
2 方法中的參數(shù)是一個集合,集合如果攜帶了通配符,那么此集合不能進(jìn)行添加和修改操作 , 可以刪除和獲取
在集合中泛型是不支持多態(tài)的和媳,如果為了匹配任意類型,我們就會使用泛型通配符了哈街。
<?> 可以表示任意類型
受限通配符
對泛型做約束留瞳,給泛型指定類型時,只能是某個類的父類或子類骚秦。
下限
? super 類型
上限
? extends 類型
visualgo.net