當前位置:
首頁 > 知識 > Java泛型的應用

Java泛型的應用

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

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

1.>代表什麼意思

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

extends後面跟的類型,如<任意字元 extends 類/介面>表示泛型的上限。示例代碼如下:

Java泛型的應用

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

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

2. > 和 > 有什麼不同

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

  • >

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

代碼如下所示:

Java泛型的應用

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

  • >

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

Java泛型的應用

此時編譯通過,這裡可以理解為>!因為Calendar為GregorianCalendar 的父類並且GregorianCalendar 實現了Comparable,具體可以在API中進行查看!

3. 實例代碼演示

代碼如下所示:

Java泛型的應用

Java泛型的應用

上面的代碼包括三個類:

1. Animal實現了Comparable介面,通過年齡來比較實例的大小

2. Dog從Animal繼承,為其子類。

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

  • mySort1()使用>類型參數

  • mySort2()使用>類型參數

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

3.1 對mySort1()進行測試,main方法代碼如下所示:

Java泛型的應用

結果編譯出錯,報錯信息為:

Java泛型的應用

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

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

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

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

3.2 對mySort12()進行測試,main方法代碼如下所示:

Java泛型的應用

這時候我們發現該程序可以正常運行。它不但能夠接受Animal implements Comparable這樣的參數,也可以接收:Dog implements Comparable這樣的參數。

3.3 是否可以通過將Dog實現Comparable來解決問題?

由分析可得程序出現問題是因為Dog類沒有實現介面Comparable,那麼我們能否將該類實現介面Comparable來解決問題呢?

代碼如下所示:

Java泛型的應用

結果程序編譯報錯,錯誤信息如下所示:

Java泛型的應用

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

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

4. 總結

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


學習Java的同學注意了!!!

學習過程中遇到什麼問題或者想獲取學習資源的話,歡迎加入Java學習交流群495273252,我們一起學Java!

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Java團長 的精彩文章:

Java學習之static關鍵字
Java學習之數組
作為程序猿/媛的你在5.20這一天都幹了什麼?
程序員求職簡歷中一些常見的問題
靠譜程序員必備技能——重構

TAG:Java團長 |

您可能感興趣

Kotlin 泛型
Swift 泛型
Android 泛型與ArrayAdapter適配器 初步入門
scala學習-泛型、界定、形變、this.type、複合類型、抽象類型
Swift 項目中涉及到 JSONDecoder,網路請求,泛型協議式編程的一些記錄和想法
Kotlin語言中的泛型設計哲學
Swift 運用協議泛型封裝網路層
技術分分享:Kotlin 泛型之類型擦除
封裝網路請求之-通過Gson轉換多級泛型
看完這篇,終於知道自己會不會 C# 泛型了