Spa*_*tta 4 generics inline type-erasure kotlin kotlin-reified-type-parameters
我读到的所有关于类型具体化的教程都说我们在使用“具体化”时需要使用“内联”,但没有一个解释原因。
假设我有一个函数:
inline fun <reified T> doSomething(value: T) {
println("Doing something with type: ${T::class.simpleName}")
}
Run Code Online (Sandbox Code Playgroud)
据我了解,使用“具体化”可以防止类型擦除。那么为什么我们不能在普通的非内联函数中使用它呢?使用内联将使编译器在调用站点复制上述函数的主体。但为什么我们需要这样的事情发生呢?
具体化类型并不神奇——类型擦除仍然照常发生。那么具体化类型是如何工作的呢?好吧,假设我打电话:
doSomething("Foo")
Run Code Online (Sandbox Code Playgroud)
编译器计算出来的T是String. 并且可以直接将上面这行翻译成:
println("Doing something with type: ${String::class.simpleName}")
Run Code Online (Sandbox Code Playgroud)
因此,从表面上看,类型似乎是具体化的,但实际上,类型只是内联的。这也是该函数需要的原因inline。如果不是inline,编译器无法内联类型参数。