Java 萬用字元 ? 學習
阿新 • • 發佈:2019-01-22
定義
泛型的一種延伸,擴充套件.
分類
"<? extends T> ":型別上界,表示引數化型別的可能是T 或是 T的子類
‘<? super T>’:型別下界,表示引數化型別是此型別的超型別(父型別),直至Object
用法
<? extends T>
List<? extends Father> list1 = getFatherList();//借用參考連結裡面的例子
list1 不能新增任何元素.只能取,
不能新增的邏輯如下
List list = new ArrayList();
- list是一組同一型別T的list,
- List<? extends Father> 如果新增的話,新增的引數是 ? , 而 ? 可能是繼承Father 的 Father1,繼承Father 的 Father2,
- Father1 和Father2 是平級關係,兩者沒有直接的繼承關係, 不能相互強制轉換cast, cast 的話會異常,
那為什麼都不強轉cast成Father呢? 強轉成Father後 資訊丟失,都是同一種類型Father,和使用泛型List 一樣了,和使用目的不符,
<? super T>
List<? super Father> list1 = getFatherList()
list1 只能新增Father 或者Father 的子類,讀取的東西只能存放在Object 類裡面,
為什麼能新增子類
List<? super Father> 新增的引數是 ? ,而 ? 是Father的 父類, 所以引數 ? 可能是Father 的父類 1Father和2Father, add時子類可以強制cast成父類Father 來add,而不會造成資料丟失,
讀取的東西只能放Object 類
List<? super Father> 的引數 ? , 可能是Father 的父類 1Father和2Father,
1Father 和 2Father 如果有繼承關係還好,可以相互cast,但是資訊可能丟失,如果1Father 和2Father 沒有繼承關係,獲取時cast 就會異常,
解決的問題
寫給別人用的邏輯資料結構時,明確告訴呼叫者資料結構的限制(骨架),不能脫離範圍. 和 無限制 T 形成區別.