La igualdad de class Kotlin falla

El siguiente fragment muestra el resultado de probar la igualdad de references Kotlin KClass obtenidas de diferentes fonts. Sus representaciones de strings son las mismas. Pero sus classs de Java son diferentes. Se espera que c , c0 y c1 sean iguales. Pero por alguna razón no lo son.

¿Hay algún matiz o es un error? Si no es un error, ¿cuál es la forma más confiable de probar la igualdad de KClass ?

 fun main(args: Array<String>) { val c = Int::class fun test(v0: Any, v1: Any) { val c0 = v0.javaClass.kotlin val c1 = v1.javaClass.kotlin println("c= $c; c0= $c0; c1= $c1") // c= class kotlin.Int; c0= class kotlin.Int; c1= class kotlin.Int println("c= ${c.java}; c0= ${c0.java}; c1= ${c1.java}") // c= int; c0= class java.lang.Integer; c1= class java.lang.Integer println("c = c0? ${c == c0}; c0 = c1? ${c1 == c0}") // c = c0? false; c0 = c1? true } test(11, 22) } 

EDITAR:

La solución consiste en utilizar el método KClass.javaObjectType .

Los documentos dicen:

Devuelve una instancia de Java Class correspondiente a la instancia de KClass dada. En el caso de los types primitivos, devuelve las classs de contenedor correspondientes.

Es decir, c.javaObjectType == c1.javaObjectType es verdadero

Pero no justifica por qué KClass es tener la misma representación de cadena son diferentes. Al less es confuso. Y es una buena idea tener en count eso en los documentos.

En su caso, la igualdad falla porque KClass es se consideran iguales cuando corresponden al mismo tipo de Java, no del mismo tipo de Kotlin. Esto es falso para int y java.lang.Integer .

La solución consiste en utilizar la propiedad javaObjectType , que devolverá la class Java (no el tipo primitivo) incluso para el tipo Kotlin comstackdo en la primitiva de Java:

  fun sameClass(c1: KClass<*>, c2: KClass<*>) = c1.javaObjectType == c2.javaObjectType sameClass(Int::class, (1 as Any?)!!.javaClass.kotlin) //true 

Estoy de acuerdo en que esta semántica es bastante confusa, archivé un problema al respecto.

Además, KClass no refleja la nulabilidad de los types de Kotlin, y en caso de que necesite trabajar con los types de Kotlin declarados con precisión, necesitará usar KType , que sí lo hace.


UPD: el problema ha sido marcado como fijo, y la igualdad se explica en KClass.equals KDoc desde 1.0.2.

  • Kotlin obtiene la anotación de campo siempre vacía
  • String.intern () devuelve diferentes valores en un controller JDBC
  • ¿Puedo get una KFunction de una variable del tipo de function en Kotlin?
  • instancia :: class.java vs. instance.javaClass
  • kotlin reflexión verificación nullable types
  • Kotlin enlazó la incoinheritance de las references invocables
  • Kotlin, cómo recuperar el valor del campo a través de la reflexión
  • Kotlin: isAssignableFrom y reflexiones del tipo de reflexión
  • ¿El comstackdor de Kotlin siempre conserva los nombres de los parameters en bytecode?
  • Kotlin: comparar los valores de propiedad de diferentes objects objective con (fuera) reflexión
  • Usar reflexión para pasar y modificar una primitiva sin usar matriz