利用有限制通配符提高API靈活性(28)

一、參數化類型是不可變的java

  • List<String> 不是List<Object>的子類,可是兩者是有聯繫的
  • 利用有限制的通配符類型處理相似狀況 
  • List<? extends Object>(生產者)
  • Collection<? super E>(消費者)

二、Object – 是全部類的根類,api

  • 任何類的對象均可以設置給該Object引用變量,可能須要類型強制轉換
  • 使用了泛型T、E等這些標識符後,在實際用以前類型就已經肯定了,不須要再進行類型強制轉換
  • E – Element (在集合中使用,由於集合中存放的是元素)
  • T – Type(Java 類)
  • K – Key(鍵)
  • V – Value(值)
  • N – Number(數值類型)
  • ? – 表示不肯定的java類型(無限制通配符類型)
  • <? extends T> 表示類型的上界,表示參數化類型的多是T 或是 T的子類
  • <? super T> 表示類型下界(Java Core中叫超類型限定),表示參數化類型是此類型的超類型(父類型),直至Object

四、當生成泛型類的字節碼時,編譯器用類型參數的擦除替換類型參數3d

  • 無限制類型參數 (),它的擦除是 Object
  • 上限類型參數(>),它的擦除是其上限的擦除
  • 具備多個限制的類型參數,使用其最左限制的擦除
  • 不要用通配符類型做爲返回類型

五、PECS 原則對象

  • 若是要從集合中讀取類型T的數據,而且不能寫入,可使用 ? extends 通配符;(Producer Extends)
  • 若是要從集合中寫入類型T的數據,而且不須要讀取,可使用 ? super 通配符;(Consumer Super)
  • 若是既要存又要取,那麼就不要使用任何通配符

六、Comparable<? super T> 優於Comparable<T> blog

6.一、下述不能編譯經過:編譯器

  • 增長顯式的類型參數,能夠正確使用

6.二、List 使用了泛型,迭代器也要跟着變io

七、無限制的類型參數(第一個)、無限制的通配符(第二個)編譯

  • 公共api 第二種更好一些,由於簡單

八、下述代碼,不能編譯泛型

  • 不能將null 以外的任何值放入 List<?>

這種狀況下,優先使用通配符,上述代碼能夠改成:變量

九、總結

  • 使用通配符比較須要技巧,可是得api 靈活得多
  • 注意PECS原則(producer Extends Consumer super)
相關文章
相關標籤/搜索