¿Los types reificados de Kotlin son incorrectos para los primitivos en la JVM?

Si una invocación de function de Kotlin reifica una primitiva, por ejemplo Int , la class 'pasada' es la de la primitiva en caja, no la versión sin casilla.

 inline fun <reified T> reify() = T::class @Test fun reified_type_doesnt_match_for_primitive() { assertNotEquals(Int::class, reify<Int>()) assertNotEquals(Int::class.java, reify<Int>().java) assertNotEquals<Any>(Int::class, reify<Int?>()) val nullableInt: Int? = 42 assertNotEquals(nullableInt!!.javaClass.kotlin, reify<Int>()) assertEquals<Any>(java.lang.Integer::class.java, reify<Int>().java) } @Test fun reified_type_matches_for_class() { assertEquals(String::class, reify<String>()) } 

¿Es esto un error?

Esto es algo confuso, pero el comportamiento actual es por layout. Este enfoque tiene un beneficio importante en comparación con el que trataríamos a T::class.java como una class primitiva. Si la function tiene un parámetro de tipo T , su class Java siempre es igual a T::class.java en time de ejecución (suponiendo que T es final). Esto es en realidad algo muy razonable de esperar:

  inline fun <reified T : Any> foo(t: T) { assert(T::class.java == t.javaClass) } 

Esto sucede porque el parámetro de un tipo genérico T solo puede tener un valor de reference en time de ejecución, que es necesariamente un valor encuadrado si T es un tipo primitivo.

También vea un hilo en el foro de Kotlin sobre este tema: https://devnet.jetbrains.com/thread/475540

  • Regresar la function de object de llamada de class interna
  • Constructor de class de datos con dos constructores diferentes en Kotlin
  • FragmentManager lanza IllegalArgumentException en Kotlin
  • ¿Conversión de Kotlin SAM con una interfaz Java interna privada?
  • Excepción fatal cuando no está conectado a Internet
  • Kotlin recomienda la manera de anular el logging de un oyente con un SAM
  • La expresión lambda no se usa
  • Kotlin Android, Spinner setSelection no resuelto
  • kotlin coroutine val vs diversión
  • Miembro de Kotlin y extensión al mismo time
  • Cómo modificar la variable de instancia de AsyncTask por separado