Kotlin 面试题
目录

Kotlin 中泛型擦除 (Generics Erasure) 的概念是什么?

· 约 3 分钟读完 · 第 107 / 200 章

推荐答案

在 Kotlin 中,泛型擦除(Generics Erasure)是指在编译时,泛型类型信息会被擦除,运行时无法获取泛型的类型信息。这意味着在运行时,List<String> 和 List<Int> 都会被当作 List<*> 处理,无法区分具体的类型参数。

本题详细解读

泛型擦除的背景

泛型擦除是 Java 虚拟机(JVM)为了保持向后兼容性而引入的一种机制。由于 Java 5 之前没有泛型,为了确保旧版本的代码能够正常运行,JVM 在编译时会擦除泛型类型信息,只保留原始类型(Raw Type)。

Kotlin 中的泛型擦除

Kotlin 运行在 JVM 上,因此也继承了 Java 的泛型擦除机制。在 Kotlin 中,泛型类型参数在编译时会被擦除,运行时无法获取具体的类型信息。例如:

泛型擦除的影响

由于泛型擦除,以下操作在运行时是无法实现的:

  1. 类型检查:无法在运行时检查一个集合的具体类型参数。

  2. 类型转换:无法在运行时将一个泛型类型转换为另一个泛型类型。

  3. 创建泛型类型的实例:无法在运行时创建带有具体类型参数的泛型类型实例。

绕过泛型擦除的方法

虽然泛型擦除限制了运行时获取类型信息的能力,但可以通过以下方式绕过部分限制:

  1. 内联函数与 reified 类型参数:使用 inline 函数和 reified 关键字可以在编译时保留类型信息。

  2. 显式传递类型信息:通过传递 Class<T> 对象来保留类型信息。

总结

泛型擦除是 Kotlin 和 Java 中泛型实现的一个重要特性,它在编译时擦除类型信息以确保与旧版本代码的兼容性。虽然这限制了运行时获取类型信息的能力,但通过内联函数和显式传递类型信息等方法,可以在一定程度上绕过这些限制。