面试题答案
一键面试类型实化解决类型擦除问题的方式
在Java中,由于类型擦除,泛型类型信息在运行时会丢失。而Kotlin通过类型实化,在特定场景下保留泛型类型信息到运行时。例如在函数中,通过reified
关键字修饰类型参数,使得函数内部可以获取到具体的泛型类型,从而解决了类型擦除导致的运行时无法获取泛型类型信息的问题。
类型实化的原理
Kotlin的类型实化依赖于编译器的支持。当使用reified
关键字修饰类型参数时,编译器会在编译期间进行特殊处理,将泛型类型信息保留下来。在运行时,代码可以通过特定方式访问这些保留的类型信息,实现对泛型类型的操作,就好像类型擦除不存在一样。
应用场景及代码示例
-
实例化泛型类型
inline fun <reified T> createInstance(): T { return T::class.java.newInstance() } class MyClass fun main() { val instance = createInstance<MyClass>() println(instance.javaClass.name) }
在上述代码中,
createInstance
函数利用类型实化,能够在运行时实例化泛型类型T
。 -
类型检查
inline fun <reified T> isInstanceOf(obj: Any?): Boolean { return obj is T } fun main() { val number = 10 val isNumber = isInstanceOf<Int>(number) println(isNumber) val string = "hello" val isString = isInstanceOf<Int>(string) println(isString) }
此例中,
isInstanceOf
函数借助类型实化,在运行时判断对象是否为指定的泛型类型。