Java 泛型

177 阅读2分钟

什么是泛型

Java 1.5 开始引进的参数性类型的,是在编译器进行类型擦除的类型转化,所以Java的泛型是伪范型;在经过编译器转化成字节码的时候回归到原始类型,

擦除类型就是通过编译器回归到原始类型

1. 检查泛型类型,获取目标类型
2. 擦除类型变量,并替换为限定类型
如果泛型类型的类型变量没有限定(<T>),则用Object作为原始类型
如果有限定(<T extends XClass>),则用XClass作为原始类型
如果有多个限定(T extends XClass1&XClass2),则使用第一个边界XClass1作为原始类
3. 在必要时插入类型转换以保持类型安全
4. 生成桥方法以在扩展时保持多态性

Java 的泛型的好处

  1. 代码的重复
  2. 代码的健壮性质(只要编译期没有警告,那么运行期就不会出现 ClassCastException)

泛型限制

  1. 由于范型的擦除,最终是object 或者是原始类型,所以泛型接受的参数不能是基本类型;
  2. 不能使用instanceof 运算符(也是因为泛型擦除的问题)
  3. 不能定义泛型静态常量参数(静态常量参数是先于对象创建的,而泛型的类型参数是对象创建)(字节码时期只是做检查,并没有确定类型)
  4. 泛型类无法重载equals 方法,擦拭后都是都是object 对象
  5. 没法创建泛型实例
  6. 容器内泛型有关系,但是容器之间不会有任何关系

<?> 通配符 :使用通配符 一个目的 灵活的转型 API

对类型的大致定向

  1. 上界统配符 好处:多类型转型 副作用: 只读
  2. 下限统配符 好处:多类型转型 只能添加

3.<?> 非限定 不能存也不能取 4. 泛型类型限定