?# 第四章第三節--4 泛型擦拭法
標簽(空格分隔): 廖雪峰
---
## java泛型的實現方式--擦拭法
在編譯器編譯的時候,編譯器實際上把所有的泛型類型`T,`統一視為`Object`類型.也就是說虛擬機其實對泛型并不關心.而對泛型的處理過程其實發生在編譯階段.

上面是原始代碼,下面是編譯器實際處理的代碼.編譯器實際上把類型`T`視為`Object`.然后在需要的時候會根據T類型進行安全的強制轉移.所以Java的泛型實際上是由編譯器在編譯的時候進行的,編譯器內部永遠把所有類型視為`Object`.
## 擦拭法帶來的局限.
- `<T>`不能是基本數據類型,例如`int`.
因為在編譯器的內部把`T`視為`Object`,而`Object`是無法等于基本數據類型的.
- 無法獲取帶泛型的`Class`,無法用`==`或者`instanceof`判斷是否相等.

所有的泛型實例,無論泛型的T是什么。`getClass`返回的`Class`都是同一個`Class`。
- 泛型的方法中不能有和`Object`本身方法重名的方法.
## 泛型的繼承
- 繼承泛型必須指明泛型參數,而子類中也就只能存放泛型參數中的類型.

- 可以通過子類獲取父類的泛型類型.

## 小節小結
- Java的泛型采用擦拭法的方式實現.
- 擦拭法決定了泛型<T>:
1. 不能是基本類型,例如int
2. 不能獲取待泛型類型的Class,例如`Pair<String>.class`
3. 不能判斷帶泛型類型的類型,例如: `x instanceof Pair<String>`
4. 不能實例化 T的類型 例如: `new T()`;
5. 泛型方法要防止重復定義方法,例如:`pulic boolean equals(T obj)`
- 子類可以通過獲取泛型類型的類型參數T.
- 前言
- 一:Java快速入門
- 二:Java面向對象編程
- 三:Java異常處理
- 錯誤處理
- Java的異常
- 捕獲異常
- 拋出異常
- 自定義異常
- 斷言和日志
- 使用斷言
- 使用JDK Logging
- 使用Commons Logging
- 使用Log4j
- 四:Java反射與泛型
- 反射
- Class類
- 訪問字段
- 調用方法
- 調用構造方法
- 獲取繼承關系
- 注解
- 使用注解
- 定義注解
- 處理注解
- 泛型
- 什么是泛型
- 使用泛型
- 編寫泛型
- 擦拭法
- extends通配符
- super通配符
- 泛型和反射
- 五:Java集合
- Java集合簡介
- Java集合簡介
- List
- 使用List
- 編寫equals方法
- Map
- Set
- Queue
- Stack
- 最佳實踐
- 六:Java IO編程
- 七:Java處理日期和時間
- 八:JUnit單元測試
- 九:Java正則表達式
- 十:Java加密與安全
- 十一:Java多線程編程
- 十二:Maven基礎
- 十三:Java網絡編程
- 十四:Java操作XML和JSON
- 十五:Java JDBC編程
- 十六:Java函數式編程