¿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

  • Kotlin crea un resultado de consulta para analizar repositorys de Github
  • Android Studio / Kotlin: error no válido "El método de anulación debería llamarse super"
  • @uncheckedVariance en Kotlin?
  • Kotlin DialogFragment editText editable always null
  • Intentando cargar un file en la actividad principal de onCreate
  • La cookie de session no persiste con JSoup
  • Maven-publish gradle plugin se salta la versión
  • Obtener acceso a una instancia en una function de contenedor
  • Los generics de Kotlin esperan un tipo inesperado
  • biblioteca kotlin que puede hacer connection httpS sin verificación de certificate (como curl --insecure)
  • Dagger2 error: Kotlin: reference no resuelta: DaggerSOMBREMENTE componente