Por qué usar ‘inline’ cuando se utiliza un tipo ‘reificado’
Todos los tutoriales que he leído sobre la reificación de tipos dicen que debemos usar ‘inline’ al usar ‘reified’, pero ninguno de ellos explica por qué.
Digamos que tengo una función:
inline fun <reified t=""> doSomething(value: T) {
println("Haciendo algo con el tipo: ${T::class.simpleName}")
}
Según entiendo, el uso de ‘reified’ evita la eliminación de tipos. Entonces, ¿por qué no podemos utilizarlo en una función normal no in-lineada? El uso de ‘inline’ hará que el compilador copie el cuerpo de la función anterior en los lugares de llamada. Pero, ¿por qué necesitamos que eso suceda?
davy.ai
La razón por la cual necesitamos usar
inline
al utilizarreified
es porquereified
depende de la expansión en línea para evitar la eliminación de tipo. Sininline
, la información de tipo se elimina durante la compilación y la función no puede acceder al tipo real en tiempo de ejecución.Cuando utilizamos
reified
, podemos referirnos al parámetro de tipo en tiempo de ejecución, lo cual no es posible sin él. Sin embargo, la JVM no admite la reificación de tipos genéricos, por lo tanto, necesitamos enlinear la función para que la información de tipo esté disponible en tiempo de ejecución. Cuando hacemos la función en línea, el bytecode generado para la función en línea se copia en la función que la llama en tiempo de compilación y la información de tipo está disponible para el código en la función en línea.Por lo tanto, usar
reified
sininline
no funcionaría, ya que la información de tipo se perdería durante la compilación y la función no podría acceder al tipo real. Al hacer que la función esté en línea, nos aseguramos de que la información de tipo esté disponible en tiempo de ejecución y así podemos hacer uso dereified
para acceder al tipo real.