什么是泛型
泛型是一种参数化的类型机制,使得代码能够适用于各种类型,从而编写更通用的代码,如集合架构;
泛型的好处:
- 可读性:在代码中直接标识参数类型
- 安全性:泛型是一种编译时的类型确认机制,能够在编译过程中检查对象的类型,确保了编译期的类型安全,从而保证泛型类型只能使用正确类型的对象,避免运行时出现ClassCastException异常
泛型的使用
- 泛型类:最典型的是容器类。没有泛型之前使用object,然后进行强制类型转换,运行时才会报错
- 泛型接口
- 泛型方法
实现原理
虚拟机中没有泛型类型对象,所有对象都是普通类
类型擦除
定义一个泛型类型时,自动提供了一个相应的原始类型,即删去类型参数后的泛型类型名。擦除类型变量后会替换为限定类型(无限定时用Object)限定类型,如
Pair<T extends Number>
,擦除后,类型变量用Number类型替换准确运转
既然类型被擦除了,那么怎样保证泛型正确运行?
在编译器层面进行实现:泛型的正常工作是依赖编译器在编译源码的时候,先进行类型检查,然后进行类型擦除并且在类型参数出现的地方插入强制转换的相关指令实现的。
约束和限定
- 泛型类型变量不能是基本数据类型
- 数组不支持泛型
- 不能实例化泛型变量
- 泛型类中的静态方法和静态变量不可以使用泛型类所声明的泛型类型参数
- 继承规则
不能讲List<String>
传递给List<Object>
。为了类型安全??
通配符
- 通配符上界:
List<? extends Number>
当插入一种Number类型后就只能继续插入这种Number类型 - 通配符下界:
List<? super Number>
可以插入所有Number类型 - 无界通配符
List<?>
表示任意类型
List<Object>
是List<?>
的子类