什么是泛型
Java 1.5 开始引进的参数性类型的,是在编译器进行类型擦除的类型转化,所以Java的泛型是伪范型;在经过编译器转化成字节码的时候回归到原始类型,
擦除类型就是通过编译器回归到原始类型
1. 检查泛型类型,获取目标类型
2. 擦除类型变量,并替换为限定类型
如果泛型类型的类型变量没有限定(<T>),则用Object作为原始类型
如果有限定(<T extends XClass>),则用XClass作为原始类型
如果有多个限定(T extends XClass1&XClass2),则使用第一个边界XClass1作为原始类
3. 在必要时插入类型转换以保持类型安全
4. 生成桥方法以在扩展时保持多态性
Java 的泛型的好处
- 代码的重复
- 代码的健壮性质(只要编译期没有警告,那么运行期就不会出现 ClassCastException)
泛型限制
- 由于范型的擦除,最终是object 或者是原始类型,所以泛型接受的参数不能是基本类型;
- 不能使用instanceof 运算符(也是因为泛型擦除的问题)
- 不能定义泛型静态常量参数(静态常量参数是先于对象创建的,而泛型的类型参数是对象创建)(字节码时期只是做检查,并没有确定类型)
- 泛型类无法重载equals 方法,擦拭后都是都是object 对象
- 没法创建泛型实例
- 容器内泛型有关系,但是容器之间不会有任何关系
<?> 通配符 :使用通配符 一个目的 灵活的转型 API
对类型的大致定向
- <? extends A> 上界统配符
好处:多类型转型
副作用: 只读 - <? super A> 下限统配符
好处:多类型转型
只能添加
3.<?> 非限定
不能存也不能取
4.<T> 泛型类型限定
网友评论