面试题答案
一键面试类型擦除概念
在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))
,编译器会报错,因为 String
和 Int
混合的 List
不符合泛型边界要求。虽然运行时由于类型擦除不知道具体类型,但编译期的检查保证了代码在运行时不会因为类型不匹配而抛出异常,从而保证了代码的安全性和正确性。