泛型的擦除与补偿(了解)

!!! note 目录

泛型的擦除与补偿(了解)

泛型擦除

泛型擦除指的是在编译时,编译器会去掉所有泛型信息。在JDK 1.5引入泛型时,泛型类型并没有在运行时存在,而是在编译时被替换为原始类型(通常是Object)。这主要是为了与Java 1.4版本的代码兼容,因为在Java 1.4及之前,没有泛型概念。

  • 兼容性:泛型擦除使得泛型代码在JDK 1.4和JDK 1.5之间能够兼容。擦除后,所有泛型相关的类型信息被替换成Object,这意味着泛型代码在运行时看起来与旧的代码没有区别。
  • 类型安全:在JDK1.5版本中,程序编译时期会对集合添加的元素进行安全检查,如果检查完是安全的、没有错误的,那么就意味着添加的元素都属于同一种数据类型,则加载类时就可以把这个泛型擦除掉。

泛型补偿

泛型补偿是指在运行时如何通过类型检查和类型转换来“恢复”泛型类型的实际类型,从而允许代码安全地访问泛型类型的方法和属性。

  • 类型转换:由于泛型擦除后,所有类型参数都被替换为Object,所以需要在运行时进行类型转换。Java虚拟机会根据泛型的实际使用情况(例如,通过类的上下文推断泛型类型)来执行类型转换。
  • 自动向下转型:在实际应用中,当从泛型集合中取出元素时,Java虚拟机会根据元素的实际类型进行向下转型。这允许代码按期望的类型操作集合中的元素,尽管这些元素在集合中被存储为Object类型。