面试题答案
一键面试类型擦除概念
在Kotlin(基于Java平台,同样存在类型擦除机制)中,类型擦除指的是在编译阶段,所有的泛型类型信息都会被移除。编译器会用其对应的原始类型(如List
的原始类型为Object
)来替换泛型类型参数。这意味着在运行时,JVM并不知道泛型的具体类型参数,只知道原始类型。
对泛型运行时表现的影响
- 无法在运行时获取泛型参数类型:由于类型擦除,运行时无法直接获取泛型实例化的具体类型。例如,对于
List<String>
,运行时实际存储的是List
,丢失了<String>
这一类型信息。 - 泛型类型检查仅在编译期:编译器在编译时会根据泛型类型参数进行类型检查,确保类型安全。但运行时,由于类型擦除,不会再进行泛型类型的检查。
类型擦除导致的问题举例
- 类型转换异常:
val list: MutableList<Int> = mutableListOf(1, 2, 3)
val rawList: MutableList = list
rawList.add("string") // 编译期不会报错,因为类型擦除后,运行时只知道是List,允许添加任何对象
val wrongValue = list[3] as Int // 运行时会抛出ClassCastException,因为实际添加了String类型对象
- 无法创建泛型数组:
// 以下代码会报错
// val array: Array<List<String>> = Array(10) { mutableListOf() }
// 原因是类型擦除后,JVM不知道实际的泛型类型,无法创建泛型数组