終於搞懂了泛型 extends T>與 super T>

終於搞明白了 extends T>與 super T>的區別,網上很多文章說的都是錯誤的,下面講下我的理解。

List、List、List>

List :完全沒有類型限制和賦值限定。List :看似用法與List一樣,但是在接受其他泛型賦值時會出現編譯錯誤。List>:是一個泛型,在沒有賦值前,表示可以接受任何類型的集合賦值,但賦值之後不能往裡面隨便添加元素,但可以remove和clear,並非immutable(不可變)集合。List>一般作為參數來接收外部集合,或者返回一個具體元素類型的集合,也稱為通配符集合。代碼驗證:

終於搞懂了泛型 <div class=
與" class="syl-page-img">

終於搞懂了泛型 <div class=
與" class="syl-page-img">


extends T>與 super T>

List 最大的問題是隻能放置一種類型,為了放置多種受泛型約束的類型,出現了 extends T>與 super T> 兩種語法。簡單來說, extends T> 是Get First,適用於取出集合元素消費的場景; super T>是Put First,適用於生產集合元素為主的場景。

super T> : 裡面放的是T或T的子類元素,注意理解, super T>是給集合設置了一個界限,不能往裡放T以上的類型,但是可以安全的插入T或T子類。因為有上界,可以安全的插入上界類型的子類。但是讀取出來時,因為無法確定具體是什麼子類型,所以只能統一轉為上屆類型,泛型丟失。


extends T> :裡面放的也是T或T的子類。那可能你會疑惑,這又什麼區別呢?, extends T> 一般是用作方法的入參,用來限制傳進來的參數必須只能是某個T類或其子類,這樣我的方法可以統一向上強制轉型為T進行處理。任何元素都不得添加進 extends T>集合內。記住 extends T>不能add元素進去。因為我們並不知道傳進來的是什麼具體的子類。


代碼示例如下,以加菲貓、貓、動物為例,說明extends和super的詳細語法差異


終於搞懂了泛型<? extends T>與<? super T>

終於搞懂了泛型 <div class=
與" class="syl-page-img">

終於搞懂了泛型<? extends T>與<? super T>


總之, extends T>的場景是put功能受限,可以讀取元素,一般用來接收參數。

而 super T>是可以插入元素。


源碼放上:在公-眾-號:技術筆記與開源分享



分享到:

關鍵字: 賦值 元素 搞懂


相關文章: