MST

星途 面试题库

面试题:Kotlin中类型擦除的基本概念及对泛型的影响

请简要阐述Kotlin中类型擦除的概念,并说明它是如何影响泛型在运行时的表现的。举例说明在类型擦除情况下,泛型类型信息的丢失会导致哪些问题。
39.4万 热度难度
编程语言Kotlin

知识考点

AI 面试

面试题答案

一键面试

类型擦除概念

在Kotlin(基于Java平台,同样存在类型擦除机制)中,类型擦除指的是在编译阶段,所有的泛型类型信息都会被移除。编译器会用其对应的原始类型(如List的原始类型为Object)来替换泛型类型参数。这意味着在运行时,JVM并不知道泛型的具体类型参数,只知道原始类型。

对泛型运行时表现的影响

  1. 无法在运行时获取泛型参数类型:由于类型擦除,运行时无法直接获取泛型实例化的具体类型。例如,对于List<String>,运行时实际存储的是List,丢失了<String>这一类型信息。
  2. 泛型类型检查仅在编译期:编译器在编译时会根据泛型类型参数进行类型检查,确保类型安全。但运行时,由于类型擦除,不会再进行泛型类型的检查。

类型擦除导致的问题举例

  1. 类型转换异常
val list: MutableList<Int> = mutableListOf(1, 2, 3)
val rawList: MutableList = list
rawList.add("string") // 编译期不会报错,因为类型擦除后,运行时只知道是List,允许添加任何对象
val wrongValue = list[3] as Int // 运行时会抛出ClassCastException,因为实际添加了String类型对象
  1. 无法创建泛型数组
// 以下代码会报错
// val array: Array<List<String>> = Array(10) { mutableListOf() }
// 原因是类型擦除后,JVM不知道实际的泛型类型,无法创建泛型数组