泛型實現(xiàn)了參數(shù)化類型的概念敌买,使代碼可以應(yīng)用于多種類型型宝。泛型術(shù)語的意思是適用于許多許多的類型燕差。泛型在編程語言中出現(xiàn)時潜叛,其最初的目的是希望類活方法能夠具備最廣泛的表達(dá)能力秽褒,通過解耦類或方法與所使用的類型之間的約束壶硅。
15.2 簡單泛型
return語句只允許返回單個對象,如果僅一次方法調(diào)用就能返回多個對象销斟,解決辦法就是創(chuàng)建一個對象庐椒,用它來只有想要返回的多個對象。通過使用泛型蚂踊,將一組對象打包存儲于其中的一個單一對象约谈,這個容器對象允許讀取其中元素,但是不允許向其中存放新的對象犁钟。
final聲明確實能夠保護(hù)public元素棱诱,在對象被構(gòu)造出來之后,聲明為final的元素便不能被再賦予其他值了涝动。
如果我們希望以此構(gòu)建一個可以應(yīng)用于各種類型的對象工具迈勋,就需要使用泛型。
15.3 泛型接口
泛型也可以應(yīng)用于接口醋粟。例如生成器靡菇,這是一種專門負(fù)責(zé)創(chuàng)建對象的類。實際上米愿,這是工廠方法設(shè)計模式的一種應(yīng)用厦凤。不過,當(dāng)使用生成器創(chuàng)建新的對象時育苟,它不需要任何參數(shù)较鼓,而工廠方法一般需要參數(shù)。
基本類型無法作為類型參數(shù)宙搬。
15.4 泛型方法
是否擁有泛型方法笨腥,與其所在的類是否是泛型沒有關(guān)系。
如果使用泛型方法可以取代整個類泛型化勇垛,那么就應(yīng)該只使用泛型方法脖母,因為它可以使事情更清楚明白。另外闲孤,對于一個static的方法而言谆级,無法訪問泛型類的類型參數(shù),所以讼积,如果static方法需要使用泛型能力肥照,就必須使其成為泛型方法。
當(dāng)使用泛型類時勤众,必須在創(chuàng)建對象的時候指定類型參數(shù)的值舆绎,而使用泛型方法時,通常不必指明參數(shù)類型们颜,因為編譯器會為我們找出具體的類型吕朵,這稱為類型參數(shù)推斷猎醇。因此,我們可以像調(diào)用普通方法一樣調(diào)用努溃,而且就好像是被無限次地重載過硫嘶。
15.5 匿名內(nèi)部類
class Customer {
private static long counter = 1;
private final long id = counter++;
private Customer() {
}
public String toString() {
return "Customer " + id;
}
public static Generator<Customer> generator() {
return new Generator<Customer>() {
public Customer next() {
return new Customer();
}
};
}
}
class Teller {
private static long counter = 1;
private final long id = counter++;
private Teller() {
}
public String toString() {
return "Teller " + id;
}
public static Generator<Teller> generator = new Generator<Teller>() {
public Teller next() {
return new Teller();
}
};
}
15.7 擦除的神秘之處
在泛型代碼內(nèi)部,無法獲得任何有關(guān)泛型參數(shù)類型的信息梧税。
java泛型是使用擦除來實現(xiàn)的沦疾,這意味著當(dāng)你在使用泛型時,任何具體的類型信息都被擦除了第队,你唯一知道的就是你在使用一個對象哮塞。因此List<String>和List<Integer>在運行時事實上是相同的類型。這兩種形式都被擦除成它們的原生類型斥铺,即List彻桃。
擦除主要的正當(dāng)理由是從非泛化代碼到泛化代碼的轉(zhuǎn)變過程,以及在不破壞現(xiàn)有類庫的情況下晾蜘,將泛型融入到j(luò)ava語言中邻眷。
不能創(chuàng)建泛型數(shù)組,一般的解決方案是在任何想要創(chuàng)建泛型數(shù)組的地方都是用ArrayList
15.9 邊界
邊界使得你可以在用于泛型的參數(shù)類型上設(shè)置限制條件剔交,其潛在的一個更重要的效果是可以按照自己的邊界類型來調(diào)用方法肆饶。
extends關(guān)鍵字在泛型邊界上下文環(huán)境中和在普通情況下所具有的意義是完全不同的。
15.10 通配符
數(shù)組類型賦值時岖常,不適用向上轉(zhuǎn)型驯镊,運行時期拋出異常。
數(shù)組在語言中是完全定義的竭鞍,因此可以內(nèi)建了編譯期和運行時的檢查板惑,但是在使用泛型時,編譯器和運行時系統(tǒng)都不知道想要類型做什么偎快,以及應(yīng)該采用什么樣的規(guī)則冯乘。
List<?>實際上表示“持有任何Object類型的原生List”,而List<?>表示“具有某種特定類型的非原生List晒夹,只是我們不知道那種類型是什么裆馒。”