Java基礎之泛型

泛型類和泛型方法

泛型是Java語言中實現程序多態的一種重要方法,泛型多用於底層代碼中,以此來保證代碼的通用型。今天咱們就來簡單的講一下泛型中的基本內容

泛型的定義

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

1.在程序編碼中一些包含類型參數的類型,也就是說泛型的參數只可以代表類,不能代表個別對象。

2.在程序編碼中一些包含參數的類。其參數可以代表類或對象等等。

上述引用維基百科中對泛型的定義,通俗的講,在Java中泛型就是可以讓類或者方法的輸入類型可變,形式上用特殊的符號(例如T,K,V)等來代替原來方法或者類型的參數,可以理解爲佔位符。這個佔位符在程序的編譯階段將被翻譯成爲我們輸入的類型,以此來實現程序的多態。

泛型類

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; }
}

泛型類是泛型最基本的應用之一,很多JDK源碼中的類型,例如List、Map、Set等都是以泛型類的形式定義的。在類的定義時,在類名之後以作爲類型標誌,並在類的方法中使用該類型進行參數聲明。該類使用時同樣以的形式,進行類型的注入。當不進行類型的限定時,類型變量繼承於Object類。我們在使用泛型的時候,不能使用類似於int、double等基本類型,而是需要使用Integer、Double等包裝類型下面我們來看一個例子

    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()方法可以獲得一個輸入數組的最大值和最小值,方法的返回類型爲Pair,即上述定義的Pair類的一個對象。

        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());

調用該方法的輸出爲

min is : 2
max is : 9

泛型方法

上述minmax()方法中使用了泛型類,但該方法卻不是一個泛型的方法。該方法規定了我們僅可以輸入Interger類型的數據。接下來,我們需要對該方法進行改造,將方法的輸入和返回值也改成泛型。即用類型變量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);
    }

但是進行改造之後,編譯器報錯,並不能編譯通過。原因是因爲泛型變量中找不到compareTo()方法。

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

類型變量的限定

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

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

則在代碼編譯的時候,將繼承Comparable,也就意味着參數的輸入僅可以爲實現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


寫程序的小火箭

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章