Java泛型的應用
在觀察Java源碼的時候,發現了這麼一個寫法T extends Comparable super T>。不禁納悶為什麼要這麼寫呢?有什麼好處嗎,extends和super在這裡的作用著實讓人有點不清楚。
接下來,我將結合代碼跟大家分享一下我關於這裡泛型應用的看法。
1.
大家可以明白的是這裡應用到了Java的泛型,那麼首先向大家說明一下這裡extends的作用
extends後面跟的類型,如<任意字元 extends 類/介面>表示泛型的上限。示例代碼如下:
在理解了extends所表示的泛型的上限後,接下來介紹一下super的作用,它與extends相反,表示的是泛型的下限。
所以結合上述兩點,我們來分析一下這句話整體代表什麼意思。首先,extends對泛型上限進行了限制即T必須是Comparable super T>的子類,然後 super T>表示Comparable<>中的類型下限為T!
2.
接下來我們通過對比,使得大家對為何要這樣編寫代碼有更加深刻的印象。
>
它代表的意思是:類型T必須實現Comparable
介面,並且這個介面的類型是T。這樣,T的實例之間才能相互比較大小。這邊我們以Java中GregorianCalendar這個類為例。
代碼如下所示:
這裡編譯報錯,因為這裡的
>
它代表的意思是:類型T必須實現Comparable
介面,並且這個介面的類型是T或者是T的任一父類。這樣聲明後,T的實例之間和T的父類的實例之間可以相互比較大小。同樣還是以GregorianCalendar為例。代碼如下所示:
此時編譯通過,這裡可以理解為
3. 實例代碼演示
代碼如下所示:
上面的代碼包括三個類:
1. Animal實現了Comparable
2. Dog從Animal繼承,為其子類。
3. Test類中提供了兩個排序方法和測試用的main()方法:
mySort1()使用
>類型參數 mySort2()使用
>類型參數 main()測試方法。在這裡將分別創建Animal和Dog兩個序列,然後調用排序方法對其進行測試。
3.1 對mySort1()進行測試,main方法代碼如下所示:
結果編譯出錯,報錯信息為:
mySort1() 方法的類型參數是
如果傳入的是List
但是,如果傳入的參數是List
注意:animals list中實際上是包含一個Dog實例的。如果碰上類似的情況(子類list不能傳入到一個方法中),可以考慮把子類實例放到一個父類 list 中,避免編譯錯誤。
3.2 對mySort12()進行測試,main方法代碼如下所示:
這時候我們發現該程序可以正常運行。它不但能夠接受Animal implements Comparable
3.3 是否可以通過將Dog實現Comparable
由分析可得程序出現問題是因為Dog類沒有實現介面Comparable
代碼如下所示:
結果程序編譯報錯,錯誤信息如下所示:
意義是Dog類已經從Animal中繼承了Comparable該介面,無法再實現一個Comparable。
若子類需要使用自己的比較方法,則需要重寫父類的public int CompareTo(Animal other)方法。
4. 總結
對Animal/Dog這兩個有父子關係的類來說:
學習Java的同學注意了!!!
學習過程中遇到什麼問題或者想獲取學習資源的話,歡迎加入Java學習交流群495273252,我們一起學Java!


※Java學習之static關鍵字
※Java學習之數組
※作為程序猿/媛的你在5.20這一天都幹了什麼?
※程序員求職簡歷中一些常見的問題
※靠譜程序員必備技能——重構
TAG:Java團長 |
※Kotlin 泛型
※Swift 泛型
※Android 泛型與ArrayAdapter適配器 初步入門
※scala學習-泛型、界定、形變、this.type、複合類型、抽象類型
※Swift 項目中涉及到 JSONDecoder,網路請求,泛型協議式編程的一些記錄和想法
※Kotlin語言中的泛型設計哲學
※Swift 運用協議泛型封裝網路層
※技術分分享:Kotlin 泛型之類型擦除
※封裝網路請求之-通過Gson轉換多級泛型
※看完這篇,終於知道自己會不會 C# 泛型了