泛型類和泛型方法
泛型是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