Java基礎(chǔ)之<泛型>

泛型類和泛型方法

泛型是Java語(yǔ)言中實(shí)現(xiàn)程序多態(tài)的一種重要方法,泛型多用于底層代碼中,以此來(lái)保證代碼的通用型。今天咱們就來(lái)簡(jiǎn)單的講一下泛型中的基本內(nèi)容

泛型的定義

泛型的定義主要有以下兩種:

1.在程序編碼中一些包含類型參數(shù)的類型,也就是說(shuō)泛型的參數(shù)只可以代表類,不能代表個(gè)別對(duì)象。
2.在程序編碼中一些包含參數(shù)的類。其參數(shù)可以代表類或?qū)ο蟮鹊取?/p>

上述引用維基百科中對(duì)泛型的定義,通俗的講,在Java中泛型就是可以讓類或者方法的輸入類型可變,形式上用特殊的符號(hào)(例如T,K,V)等來(lái)代替原來(lái)方法或者類型的參數(shù),可以理解為占位符。這個(gè)占位符在程序的編譯階段將被翻譯成為我們輸入的類型,以此來(lái)實(shí)現(xiàn)程序的多態(tài)。

泛型類

public class Pair<T>
{
    private T first;
    private T second;

    public Pair()
    {
        this.first = null;
        this.second = null;
    }
    public Pair(T first, T second)
    {
        this.first = first;
        this.second = second;
    }
    public T getFirst() { return first; }
    public void setFirst(T first) { this.first = first; }
    public T getSecond() { return second; }
    public void setSecond(T second) { this.second = second; }
}

泛型類是泛型最基本的應(yīng)用之一,很多JDK源碼中的類型,例如List、Map、Set等都是以泛型類的形式定義的。在類的定義時(shí),在類名之后以<T>作為類型標(biāo)志,并在類的方法中使用該類型進(jìn)行參數(shù)聲明。該類使用時(shí)同樣以<Integer>的形式,進(jìn)行類型的注入。當(dāng)不進(jìn)行類型的限定時(shí),類型變量<T>繼承于Object類。我們?cè)谑褂梅盒偷臅r(shí)候,不能使用類似于int、double等基本類型,而是需要使用Integer、Double等包裝類型下面我們來(lái)看一個(gè)例子

    public static Pair<Integer> minmax(Integer...a)
    {
        if(a == null || a.length == 0) {return null;}
        Integer max = a[0];
        Integer min = a[0];
        for(Integer num : a)
        {
            if (min.compareTo(num) > 0) min = num;
            if (max.compareTo(num) < 0) max = num;
        }
        return new Pair<>(min,max);

minmax()方法可以獲得一個(gè)輸入數(shù)組的最大值和最小值,方法的返回類型為Pair<Integer>,即上述定義的Pair類的一個(gè)對(duì)象。

        Integer[] words = {3, 7, 9, 2};
        ArrayAlg arrayAlg = new ArrayAlg();
        Pair<Integer> pair = arrayAlg.minmax(words);
        System.out.println("min is : " + pair.getFirst());
        System.out.println("max is : " + pair.getSecond());

調(diào)用該方法的輸出為

min is : 2
max is : 9

泛型方法

上述minmax()方法中使用了泛型類,但該方法卻不是一個(gè)泛型的方法。該方法規(guī)定了我們僅可以輸入Interger類型的數(shù)據(jù)。接下來(lái),我們需要對(duì)該方法進(jìn)行改造,將方法的輸入和返回值也改成泛型。即用類型變量T去替代之前方法中的Integer類型。

    public static <T> Pair<T> minmax2(T...a)
    {
        if(a == null || a.length == 0) {return null;}
        T max = a[0];
        T min = a[0];
        for(T num : a)
        {
            if (min.compareTo(num) > 0) min = num;
            if (max.compareTo(num) < 0) max = num;
        }
        return new Pair<>(min,max);
    }

但是進(jìn)行改造之后,編譯器報(bào)錯(cuò),并不能編譯通過(guò)。原因是因?yàn)榉盒妥兞恐姓也坏絚ompareTo()方法。

Error:(56, 20) java: 找不到符號(hào)
  符號(hào):   方法 compareTo(T)
  位置: 類型為T的變量 min
Error:(57, 20) java: 找不到符號(hào)
  符號(hào):   方法 compareTo(T)
  位置: 類型為T的變量 max

類型變量的限定

compareTo()方法是Comparable接口的實(shí)現(xiàn),解決上述編譯器錯(cuò)誤,需要通過(guò)類型變量的限定完成。將方法的聲明該成如下形式

public static <T extends Comparable> Pair<T> minmax2(T...a)

則在代碼編譯的時(shí)候,將繼承Comparable,也就意味著參數(shù)的輸入僅可以為實(shí)現(xiàn)Comparable接口的類型。

        Double[] words2 = {3.0, 7.0, 9.0, 2.0};
        Pair<Double> pair2 = arrayAlg.minmax2(words2);
        System.out.println("min is : " + pair2.getFirst());
        System.out.println("max is : " + pair2.getSecond());

程序的輸出為

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

相關(guān)閱讀更多精彩內(nèi)容

  • 什么是泛型 泛型程序設(shè)計(jì)就是為了讓一段代碼能夠被很多不同類型的對(duì)象所重用。Java提供的ArrayList就使用了...
    czn5991閱讀 503評(píng)論 0 0
  • 泛型即參數(shù)化類型。其只是作用于代碼編譯階段,在編譯過(guò)程中,對(duì)于正確檢驗(yàn)泛型結(jié)果后,會(huì)將泛型的相關(guān)信息擦除,也就是說(shuō)...
    swz_android閱讀 721評(píng)論 0 2
  • 泛型概述以及泛型類 泛型就是類型參數(shù)化,處理的數(shù)據(jù)類型不是固定的,而是可以作為參數(shù)傳入; 泛型的核心: 告訴編譯器...
    皮多堡閱讀 751評(píng)論 0 0
  • Java泛型(generics)是JDK 5中引入的一個(gè)新特性,允許在定義類/接口/方法的時(shí)候使用類型參數(shù)(typ...
    陳晨_Fly閱讀 555評(píng)論 0 10
  • 什么是泛型 泛型就是廣泛的類型,同一套代碼可以在多種類型中使用,使代碼的可重用性更高。泛型是JDK1.5加的新特性...
    CoderCyl閱讀 388評(píng)論 0 0

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