[TOC]
## 通配符和邊界

### T<? super B>
對于這個泛型,?代表容器里的元素類型,由于只規定了元素必須是B的超類,導致元素沒有明確統一的“根”(除了Object這個必然的根),所以這個泛型你其實無法使用它,對吧,除了把元素強制轉成Object。所以,對把參數寫成這樣形態的函數,你函數體內,只能對這個泛型做插入操作,而無法讀
### T<? extends B>
由于指定了B為所有元素的“根”,你任何時候都可以安全的用B來使用容器里的元素,但是插入有問題,由于供奉B為祖先的子樹有很多,不同子樹并不兼容,由于實參可能來自于任何一顆子樹,所以你的插入很可能破壞函數實參,所以,對這種寫法的形參,禁止做插入操作,只做讀取
### PECS
最后看一下什么是PECS(Producer Extends Consumer Super)原則,已經很好理解了:
* 頻繁往外讀取內容的,適合用上界Extends。
* 經常往里插入的,適合用下界Super
## 類型擦除
大家都知道,Java的泛型是偽泛型,這是因為Java在編譯期間,所有的泛型信息都會被擦掉,正確理解泛型概念的首要前提是理解類型擦除。Java的泛型基本上都是在編譯器這個層次上實現的,在生成的字節碼中是不包含泛型中的類型信息的,使用泛型的時候加上類型參數,在編譯器編譯的時候會去掉,這個過程成為**類型擦除**。
如在代碼中定義`List<Object>`和`List<String>`等類型,在編譯后都會變成`List`,JVM看到的只是`List`,而由泛型附加的類型信息對JVM是看不到的。Java編譯器會在編譯時盡可能的發現可能出錯的地方,但是仍然無法在運行時刻出現的類型轉換異常的情況,類型擦除也是 Java 的泛型與 C++ 模板機制實現方式之間的重要區別。
### 優點
避免過多的創建類而造成的運行時的過度消耗。
## java補救
1、先檢查再編譯以及編譯的對象和引用傳遞問題
### Json遇到泛型
利用`TypeReference`指定泛型中的類型, 就可以順序反序列化成功,并且 集合中的對象也轉換過來了。
## 推薦閱讀
[java 泛型詳解-絕對是對泛型方法講解最詳細的,沒有之一](https://blog.csdn.net/s10461/article/details/53941091)
[Java 泛型通配符?解惑](https://blog.csdn.net/baple/article/details/25056169)
[Java泛型類型擦除以及類型擦除帶來的問題](https://www.cnblogs.com/wuqinglong/p/9456193.html)
- Java
- Object
- 內部類
- 異常
- 注解
- 反射
- 靜態代理與動態代理
- 泛型
- 繼承
- JVM
- ClassLoader
- String
- 數據結構
- Java集合類
- ArrayList
- LinkedList
- HashSet
- TreeSet
- HashMap
- TreeMap
- HashTable
- 并發集合類
- Collections
- CopyOnWriteArrayList
- ConcurrentHashMap
- Android集合類
- SparseArray
- ArrayMap
- 算法
- 排序
- 常用算法
- LeetCode
- 二叉樹遍歷
- 劍指
- 數據結構、算法和數據操作
- 高質量的代碼
- 解決問題的思路
- 優化時間和空間效率
- 面試中的各項能力
- 算法心得
- 并發
- Thread
- 鎖
- java內存模型
- CAS
- 原子類Atomic
- volatile
- synchronized
- Object.wait-notify
- Lock
- Lock之AQS
- Lock子類
- 鎖小結
- 堵塞隊列
- 生產者消費者模型
- 線程池