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