为什么在使用 '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")
编译器得出 T
是 String
。并且它可以直接将上面这行翻译成:
println("Doing something with type: ${String::class.simpleName}")
因此,从表面上看,类型似乎是具体化的,但实际上,类型只是内联的。这也是函数需要inline
的原因。如果不是inline
,编译器无法内联类型参数。
我阅读的所有关于类型具体化的教程都说我们在使用 'reified' 时需要使用 'inline',但其中 none 解释了原因。
假设我有一个函数:
inline fun <reified T> doSomething(value: T) {
println("Doing something with type: ${T::class.simpleName}")
}
据我了解,使用 'reified' 可以防止类型擦除。那么为什么我们不能在普通的非内联函数中使用它。使用内联将使编译器在调用点复制上述函数的主体。但为什么我们需要这样呢?
具体化的类型并不神奇 - 类型擦除仍然像往常一样发生。那么具体化类型是如何工作的呢?好吧,假设我打电话给:
doSomething("Foo")
编译器得出 T
是 String
。并且它可以直接将上面这行翻译成:
println("Doing something with type: ${String::class.simpleName}")
因此,从表面上看,类型似乎是具体化的,但实际上,类型只是内联的。这也是函数需要inline
的原因。如果不是inline
,编译器无法内联类型参数。