多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 第四章第三节--4 泛型擦拭法 标签(空格分隔): 廖雪峰 --- ## java泛型的实现方式--擦拭法 在编译器编译的时候,编译器实际上把所有的泛型类型`T,`统一视为`Object`类型.也就是说虚拟机其实对泛型并不关心.而对泛型的处理过程其实发生在编译阶段. ![编译器的处理过程](http://p0b921qfc.bkt.clouddn.com/18-5-18/98406482.jpg) 上面是原始代码,下面是编译器实际处理的代码.编译器实际上把类型`T`视为`Object`.然后在需要的时候会根据T类型进行安全的强制转移.所以Java的泛型实际上是由编译器在编译的时候进行的,编译器内部永远把所有类型视为`Object`. ## 擦拭法带来的局限. - `<T>`不能是基本数据类型,例如`int`. 因为在编译器的内部把`T`视为`Object`,而`Object`是无法等于基本数据类型的. - 无法获取带泛型的`Class`,无法用`==`或者`instanceof`判断是否相等. ![无法获取Class](http://p0b921qfc.bkt.clouddn.com/18-5-18/22136504.jpg) 所有的泛型实例,无论泛型的T是什么。`getClass`返回的`Class`都是同一个`Class`。 - 泛型的方法中不能有和`Object`本身方法重名的方法. ## 泛型的继承 - 继承泛型必须指明泛型参数,而子类中也就只能存放泛型参数中的类型. ![继承](http://p0b921qfc.bkt.clouddn.com/18-5-18/13404178.jpg) - 可以通过子类获取父类的泛型类型. ![通过子类获取泛型的泛型参数类型](http://p0b921qfc.bkt.clouddn.com/18-5-18/1806342.jpg) ## 小节小结 - 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.