MST

星途 面试题库

面试题:Kotlin中类型擦除对泛型边界有什么影响

请解释Kotlin中类型擦除的概念,并说明它如何影响泛型边界的设定与使用。同时举例说明在类型擦除情况下,泛型边界如何保证代码的安全性和正确性。
32.2万 热度难度
编程语言Kotlin

知识考点

AI 面试

面试题答案

一键面试

类型擦除概念

在Kotlin中,类型擦除指的是在编译过程中,泛型类型信息会被擦除,实际运行时JVM并不知道泛型的具体类型。例如定义 List<String>,运行时JVM只知道是 List,而丢失了 String 这个具体类型信息。这是因为Java平台(Kotlin基于Java平台)为了兼容旧版本,采用了类型擦除机制。

对泛型边界设定与使用的影响

  • 泛型边界设定:Kotlin通过 where 子句或直接在类型参数后使用 : 来设定泛型边界。例如 class MyClass<T : SomeBaseClass> { } 设定了 T 的上界为 SomeBaseClass。由于类型擦除,在运行时这些边界检查主要依靠编译器在编译期完成。
  • 使用影响:在运行时,无法通过反射等手段获取泛型参数的具体类型信息。比如在函数中无法判断传入的 List 实际存储的类型是否符合泛型声明时设定的边界。

举例说明安全性和正确性

假设我们有一个函数接收一个 List,并且要求 List 中的元素必须实现 Comparable 接口,这样可以进行排序操作:

fun <T : Comparable<T>> sortList(list: List<T>): List<T> {
    return list.sorted()
}

这里 T : Comparable<T> 设定了泛型边界,编译器在编译期会检查传入的 List 中的元素是否实现了 Comparable 接口。如果调用 sortList(listOf(1, 2, 3)) 是没问题的,因为 Int 实现了 Comparable 接口;但如果调用 sortList(listOf("a", 1)),编译器会报错,因为 StringInt 混合的 List 不符合泛型边界要求。虽然运行时由于类型擦除不知道具体类型,但编译期的检查保证了代码在运行时不会因为类型不匹配而抛出异常,从而保证了代码的安全性和正确性。