Tipos reified en Kotlin: cómo utilizar el tipo dentro de una función (KDA 14)
Antonio Leiva

Una de las limitaciones que más frustran a los desarrolladores Java cuando utilizan genéricos es el no poder utilizar el tipo directamente.

Normalmente esto se solventa pasando la clase como parámetro de la función, haciendo el código más complejo y poco estético.

En Kotlin, gracias a las funciones inline, de las que ya hemos hablado, podemos utilizar tipos reified que nos permitirán utilizarlos dentro de las funciones.

¿Para qué sirve esto? Ya verás, te va a gustar.

Si todo esto te apasiona tanto como a mí, te animo a que te apuntes a mi training gratuito donde te contaré todo lo que necesitas para aprender a crear tus Apps Android en Kotlin desde cero.

Training Revienta tu productividad en Android con Kotlin

Tipos reified

Como comentaba anteriormente, marcando un tipo como reified, tendremos la capacidad de utilizar ese tipo dentro de la función.

Es importante que la función que lo utilice sea inline, ya que el código necesita ser sustituido en el lugar desde el que se ejecuta para poder funcionar. El hecho de que no se puedan utilizar tipos en las funciones es una limitación de la Máquina Virtual de Java.

Navegando a una Activity

Este es el caso más típico aplicado a Android.

En Java, cuando llamamos a startActivity, necesitamos pasar la clase de destino.

En Kotlin podemos simplificarlo simplemente tipando la función:

inline fun <reified T : Activity> Activity.startActivity() {
    startActivity(Intent(this, T::class.java))
}

Navegar a una Activity ahora es tan sencillo como esto:

startActivity<DetailActivity>()

FindView con casting

Algo que mucha gente no utiliza en Java y que es muy útil es el tema de los genéricos para devolver objetos casteados al tipo correcto en función del tipo de variable.

En Java te puedes crear una función como esta:

public <T extends View> T findView(Activity activity, int id) {
    return (T) activity.findViewById(id);
}

Y luego utilizarla de esta forma:

TextView textView = Utils.findView(activity, R.id.welcomeMessage);

Algo muy parecido se puede conseguir en Kotlin, sólo que más sencillo, como ya hemos visto, gracias a las funciones de extensión:

fun <T : View> Activity.findView(id: Int) = findViewById(id) as T

val textView = activity.findView<TextView>(R.id.welcomeMessage)

Pero en ambos casos te vas a encontrar con el problema de que el compilador no puede estar seguro de que ese casting sea válido, pues no tiene acceso al tipo de T. Así que te devolverá un warning.

Con los tipos reified te puedes evitar ese problema:

inline fun <reified T : View> Activity.findView(id: Int) = findViewById(id) as T

Conclusión

Con los tipos reified puedes conseguir resultados impensables en Java, y además conseguir hacer más seguras otras funciones que sí que son posibles en Java.

Evita volver a pasar un parámetro de tipo Class a tus funciones.

Además, con las funciones de extensión te puedes crear nuevas funciones sobre frameworks como el de Android, que lo utilizan ya en gran parte de su API.

Y si quieres aprender a utilizar Kotlin para desarrollar tus propias Apps Android, te recomiendo que le eches un vistazo al training gratuito. ¡Reserva tu plaza !

Quizá también te interese…

¿Qué es Kotlin Multiplataforma?

¿Qué es Kotlin Multiplataforma?

En el mundo actual, donde los dispositivos móviles están presentes en nuestra vida diaria, es fundamental para los desarrolladores crear aplicaciones que se adapten a diferentes sistemas operativos. Kotlin Multiplataforma es una herramienta que facilita la creación de...

5 trucos de Kotlin para escribir código más eficiente en Android

5 trucos de Kotlin para escribir código más eficiente en Android

El lenguaje de programación Kotlin se ha convertido en el más popular para el desarrollo de aplicaciones de Android en los últimos años. Su sintaxis concisa y moderna, junto con su capacidad para mejorar la eficiencia de código, lo convierten en una opción atractiva...

Cómo crear un backend en Kotlin usando Ktor

Cómo crear un backend en Kotlin usando Ktor

Ktor es un framework de servidor web ligero y rápido para Kotlin, desarrollado por JetBrains. Es ideal para crear aplicaciones web y servicios RESTful, y es muy fácil de usar y configurar. En este artículo, vamos a ver cómo crear un backend para una aplicación de...

4 Comentarios

  1. David

    Con la última función, al declarar findView(R.id.anyView) en el método onCreate, salta error diciendo que no tiene suficiente información para inferir el tipo T y que lo especifique explícitamente. ¿Hay algo incorrecto en el ejemplo?

    Responder
    • Antonio Leiva

      Sí, el renderizador de código se había comido las partes de los tipos. Ya debería estar solucionado. Si tienes cualquier duda me dices, gracias!

      Responder
  2. Luis Ángel

    Hola!
    Quisiera saber porque si pueden haber funciones que afecten el framework de Android que todos usamos, porque no existe alguna biblioteca con estas funciones para que cualquiera lo usé? No entiendo bien ¿Por que todos tendríamos que implementar la misma función?
    Gracias

    Responder

Enviar un comentario

Los datos personales que proporciones a través de este formulario quedarán registrados en un fichero de DevExpert, S.L.U., con el fin de gestionar los comentarios que realizas en este blog. La legitimación se realiza a través del consentimiento de la parte interesada. Si no se acepta, no podrás comentar en este blog. Los datos que proporciona solo se utilizan para evitar el correo no deseado y no se usarán para nada más. Puede ejercer los derechos de acceso, rectificación, cancelación y oposición en contacto@devexperto.com.

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Acepto la política de privacidad *