?泛型程序設(shè)計(jì)意味著編寫的代碼可以被很多不同類型的對象所重用。
1.類型參數(shù)的好處
?在Java中增加泛型類之前,泛型程序設(shè)計(jì)是用繼承實(shí)現(xiàn)的。ArrayList類只維護(hù)一個Object引用的數(shù)組。當(dāng)獲取一個值時必須進(jìn)行強(qiáng)制類型轉(zhuǎn)換。
?如今,ArrayList類有一個類型參數(shù)用來指示元素的類型:
ArrayList<String> files = new ArrayList();
?這使得代碼具有更好的可讀性。
2.通配符類型的好處
?但是,實(shí)現(xiàn)一個泛型類并沒有那么容易。對于類型參數(shù),程序員們可能想內(nèi)置所有的類。例如:ArrayList類有一個方法addAll用來添加另一個集合的全部元素,可能想要將ArrayList<Manager>中的所有元素添加到ArrayList<Employee>中去。然而,反過來就不行了。
?Java語言的設(shè)計(jì)者發(fā)明了一個具有獨(dú)創(chuàng)性的新概念---通配符類型,解決了上述問題。通配符類型非常抽象,然而,它們能讓庫的構(gòu)建者編寫出盡可能靈活的方法。
3.定義簡單的泛型類和泛型方法
?一個泛型類就是具有一個或多個類型變量的類。例如:
- 泛型類
public class Pair<T> {
private T first;
private T second;
public Pair() {first = null; second = null;}
public Pair(T first, T second) {this.first = first; this.second = second;}
public T getFirst() {retrun first;}
public T getSecond() {return second;}
public void setFirst(T newValue) {first = newValue;}
public void setSecond(T newValue) {second = newValue;}
}
?Pair類引入了一個類型變量T,用尖括號< >括起來,并放在類名的后面。泛型類可以有多個類型變量。例如,可以定義Pair類,其中第一個域和第二個域使用不同的類型:
public class Pair<T, U> {...}
- 泛型方法
?定義一個帶有類型參數(shù)的方法:
class ArrayAlg {
public static <T> T getMiddle(T... a) {
return a[a.length / 2];
}
}
?這是一個泛型方法,可以從尖括號和類型變量看出這一點(diǎn)。類型變量放在修飾符(public static)的前面,返回類型的后面。泛型方法可以定義在普通類中,也可以定義在泛型類中。
4.類型變量的限定
?有時,類或方法需要對類型變量加以約束。例,計(jì)算數(shù)組中最小的元素:
class ArrayAlg {
public static <T> T min(T[] a) {
if(a == null || a.length == 0) return null;
T smallest = a[0];
for (int i = 1; i < a.length; i++)
if(smallest.compareTo(a[i] > 0)) smallest = a[i];
return smallest;
}
}
?變量smallest類型為T,這意味著它可以是任何一個類的對象。怎樣才能確信T所屬的類有compareTo方法呢?可以將T限制為實(shí)現(xiàn)了Comparable接口的類??梢酝ㄟ^對類型變量T設(shè)置限定實(shí)現(xiàn)這一點(diǎn):
public static <T extends Comparable> T min(T[] a)...
?下面的記法:
<T extends BoundingType>
?表示T應(yīng)該是綁定類型的子類型。T和綁定類型可以是類,也可以是接口。一個類型變量或是通配符可以有多個限定,例如:
T extends Comparable & Serializable
?限定類型用"&"分隔,而逗號用來分隔類型變量。限定中至多有一個類,如果用一個類作為限定,它必須是限定列表中的第一個。
5.泛型代碼和虛擬機(jī)
- 虛擬機(jī)中沒有泛型,只有普通的類和方法
- 所有的類型參數(shù)都用他們的限定類型替換,沒有限定類型的用Object替換
- 橋方法被合成來保持多態(tài)
- 為保持類型安全性,必要時插入強(qiáng)制類型轉(zhuǎn)換