java 泛型擦拭法_擦拭法 · 廖雪峰java学习笔记 · 看云

# 第四章第三节--4 泛型擦拭法

标签(空格分隔): 廖雪峰

---

## java泛型的实现方式--擦拭法

在编译器编译的时候,编译器实际上把所有的泛型类型`T,`统一视为`Object`类型.也就是说虚拟机其实对泛型并不关心.而对泛型的处理过程其实发生在编译阶段.

![编译器的处理过程](http://p0b921qfc.bkt.clouddn.com/18-5-18/98406482.jpg)

上面是原始代码,下面是编译器实际处理的代码.编译器实际上把类型`T`视为`Object`.然后在需要的时候会根据T类型进行安全的强制转移.所以Java的泛型实际上是由编译器在编译的时候进行的,编译器内部永远把所有类型视为`Object`.

## 擦拭法带来的局限.

- ``不能是基本数据类型,例如`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的泛型采用擦拭法的方式实现.

- 擦拭法决定了泛型:

1. 不能是基本类型,例如int

2. 不能获取待泛型类型的Class,例如`Pair.class`

3. 不能判断带泛型类型的类型,例如: `x instanceof Pair`

4. 不能实例化 T的类型 例如: `new T()`;

5. 泛型方法要防止重复定义方法,例如:`pulic boolean equals(T obj)`

- 子类可以通过获取泛型类型的类型参数T.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值