为什么在使用 'reified' 类型时使用 'inline'

Why to use 'inline' when using a 'reified' type

我阅读的所有关于类型具体化的教程都说我们在使用 'reified' 时需要使用 'inline',但其中 none 解释了原因。

假设我有一个函数:

inline fun <reified T> doSomething(value: T) {
    println("Doing something with type: ${T::class.simpleName}")    
}

据我了解,使用 'reified' 可以防止类型擦除。那么为什么我们不能在普通的非内联函数中使用它。使用内联将使编译器在调用点复制上述函数的主体。但为什么我们需要这样呢?

具体化的类型并不神奇 - 类型擦除仍然像往常一样发生。那么具体化类型是如何工作的呢?好吧,假设我打电话给:

doSomething("Foo")

编译器得出 TString。并且它可以直接将上面这行翻译成:

println("Doing something with type: ${String::class.simpleName}")

因此,从表面上看,类型似乎是具体化的,但实际上,类型只是内联的。这也是函数需要inline的原因。如果不是inline,编译器无法内联类型参数。