java comparable 泛型_Java泛型的應用——T extends Comparable<? super T>

在觀察Java源碼的時候,發現了這么一個寫法T extends Comparable super T>。不禁納悶為什么要這么寫呢?有什么好處嗎,extends和super在這里的作用着實讓人有點不清楚。

接下來,我將結合代碼跟大家分享一下我關於這里泛型應用的看法。

1.>代表什么意思

大家可以明白的是這里應用到了Java的泛型,那么首先向大家說明一下這里extends的作用

extends后面跟的類型,如表示泛型的上限。示例代碼如下:

import java.util.*;class Demo{}public classTest

{public static voidmain(String[] args) {

Demo p = null; //編譯正確//這里因為ArrayList是List的子類所以通過//如果改為Demo p = null;就會報錯這樣就限制了上限

}

}

在理解了extends所表示的泛型的上限后,接下來介紹一下super的作用,它與extends相反,表示的是泛型的下限。

所以結合上述兩點,我們來分析一下這句話整體代表什么意思。首先,extends對泛型上限進行了限制即T必須是Comparable super T>的子類,然后 super T>表示Comparable<>中的類型下限為T!

2.  > 和 > 有什么不同

接下來我們通過對比,使得大家對為何要這樣編寫代碼有更加深刻的印象。

>

它代表的意思是:類型T必須實現Comparable接口,並且這個接口的類型是T。這樣,T的實例之間才能相互比較大小。這邊我們以Java中GregorianCalendar這個類為例。

代碼如下所示:

importjava.util.GregorianCalendar;class Demo>{}//注意這里是沒有? super的

public classTest

{public static voidmain(String[] args) {

Demo p = null;

}

}

這里編譯報錯,因為這里的>相當於>,但是GregorianCalendar中並沒有實現Comparable,而是僅僅持有從Calendar繼承過來的Comparable,這樣就會因為不在限制范圍內而報錯。

>

它代表的意思是:類型T必須實現Comparable接口,並且這個接口的類型是T或者是T的任一父類。這樣聲明后,T的實例之間和T的父類的實例之間可以相互比較大小。同樣還是以GregorianCalendar為例。代碼如下所示:

importjava.util.GregorianCalendar;class Demo>{}public classTest1

{public static voidmain(String[] args) {

Demo p = null; //編譯正確

}

}

此時編譯通過,這里可以理解為>!因為Calendar為GregorianCalendar 的父類並且GregorianCalendar 實現了Comparable,具體可以在API中進行查看!3. 實例代碼演示代碼如下所示:importjava.util.ArrayList;importjava.util.Collections;importjava.util.List;public classTest

{//第一種聲明:簡單,靈活性低

public static > void mySort1(Listlist)

{

Collections.sort(list);

}//第二種聲明:復雜,靈活性高

public static > void mySort2(Listl)

{

Collections.sort(list);

}public static voidmain(String[] args)

{//主函數中將分別創建Animal和Dog兩個序列,然后調用排序方法對其進行測試

//main函數中具體的兩個版本代碼將在下面具體展示}

}class Animal implements Comparable{protected intage;public Animal(intage)

{this.age =age;

}//使用年齡與另一實例比較大小

@Overridepublic intcompareTo(Animal other)

{return this.age -other.age;

}

}class Dog extendsAnimal

{public Dog(intage)

{super(age);

}

}

上面的代碼包括三個類:

Animal實現了Comparable接口,通過年齡來比較實例的大小

Dog從Animal繼承,為其子類。

Test類中提供了兩個排序方法和測試用的main()方法:

mySort1()使用>類型參數

mySort2()使用>類型參數

main()測試方法。在這里將分別創建Animal和Dog兩個序列,然后調用排序方法對其進行測試。

3.1 對mySort1()進行測試,main方法代碼如下所示://創建一個 Animal List

List animals = new ArrayList();

animals.add(new Animal(25));

animals.add(new Dog(35));//創建一個 Dog List

List dogs = new ArrayList();

dogs.add(new Dog(5));

dogs.add(new Dog(18));//測試 mySort1() 方法

mySort1(animals);

mySort1(dogs);

結果編譯出錯,報錯信息為:The method mySort1(List) in the type TypeParameterTest is not applicable for the arguments (List)

mySort1() 方法的類型參數是>,它要求的類型參數是類型為T的Comparable。

如果傳入的是List程序將正常執行,因為Animal實現了接口Comparable。

但是,如果傳入的參數是List程序將報錯,因為Dog類中沒有實現接口Comparable,它只從Animal繼承了一個Comparable接口。

注意:animals list中實際上是包含一個Dog實例的。如果碰上類似的情況(子類list不能傳入到一個方法中),可以考慮把子類實例放到一個父類 list 中,避免編譯錯誤。

3.2 對mySort12()進行測試,main方法代碼如下所示:public static voidmain(String[] args)

{//創建一個 Animal List

List animals = new ArrayList();

animals.add(new Animal(25));

animals.add(new Dog(35));//創建一個 Dog List

List dogs = new ArrayList();

dogs.add(new Dog(5));

dogs.add(new Dog(18));//測試 mySort2() 方法

mySort2(animals);

mySort2(dogs);

}

這時候我們發現該程序可以正常運行。它不但能夠接受Animal implements Comparable這樣的參數,也可以接收:Dog implements Comparable這樣的參數。3.3 是否可以通過將Dog實現Comparable來解決問題?由分析可得程序出現問題是因為Dog類沒有實現接口Comparable,那么我們能否將該類實現接口Comparable來解決問題呢?代碼如下所示:class Dog extends Animal implements Comparable{public Dog(intage)

{super(age);

}

}

結果程序編譯報錯,錯誤信息如下所示:The interface Comparable cannot be implemented more than once with different arguments: Comparable and Comparable

意義是Dog類已經從Animal中繼承了Comparable該接口,無法再實現一個Comparable。

若子類需要使用自己的比較方法,則需要重寫父類的public int CompareTo(Animal other)方法。

4. 總結

對Animal/Dog這兩個有父子關系的類來說:>可以接受List,也可以接收 List 。而>只可以接收 List所以,>這樣的類型參數對所傳入的參數限制更少,提高了 API 的靈活性。總的來說,在保證類型安全的前提下,要使用限制最少的類型參數。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值