泛型程序設(shè)計(jì)---基本概念

?泛型程序設(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)換
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容