Todos los tutoriales que leí sobre la reificación de tipos dicen que necesitamos usar 'en línea' cuando usamos 'reificado', pero ninguno de ellos explica por qué.
Digamos que tengo una función:
inline fun <reified T> doSomething(value: T) { println("Doing something with type: ${T::class.simpleName}") }Según tengo entendido, el uso de 'reificado' evita el borrado de tipos. Entonces, ¿por qué no podemos usarlo en una función normal no en línea? El uso de inline hará que el compilador copie el cuerpo de la función anterior en los sitios de llamadas. Pero, ¿por qué necesitamos que eso suceda?
Los tipos cosificados no son mágicos: el borrado de tipos sigue ocurriendo como de costumbre. Entonces, ¿cómo funcionan los tipos cosificados? Bueno, digamos que llamo:
doSomething("Foo") El compilador calcula que T es String . Y puede traducir directamente la línea anterior a:
println("Doing something with type: ${String::class.simpleName}") Por lo tanto, a nivel de superficie, parece como si el tipo estuviera cosificado, pero en realidad, el tipo solo está alineado. Esta es también la razón por la cual la función debe estar inline . Si no está en inline , el compilador no puede insertar en línea el parámetro de tipo.