一、參數化類型是不可變的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 靈活得多
- 注意PECS原則(producer Extends Consumer super)