1. 程式人生 > >Java 萬用字元 ? 學習

Java 萬用字元 ? 學習

定義

泛型的一種延伸,擴充套件.

分類

"<? 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 形成區別.

以上僅個人理解,未讀原始碼,妄自揣測聖意,