Una confusión sobre Int :: class.java.isInstance () en Kotlin

El resultado de Int::class.java.isInstance(4) es falso.

Pero String::class.java.isInstance("aa") es verdadero.

Cuál es la forma correcta de verificación de tipo Int en la function de esta manera.

 fun <T> castValue(v: Any?, clazz: Class<T>): T? { if (v != null && clazz.isInstance(v) return v as T return null } val result = castValue(4, Int::class.java) 

Puede lograr esto utilizando el parámetro de tipo reified :

 inline fun <reified T> cast(value:Any?): T? = value as? T 

Y llámalo así:

cast<Boolean>(false)

::class.java es un método de llamada de Java en lugar de Kotlin.

Si quiere probar el tipo, use

 val isInt = 1 is Int // true 

Si quieres probar el reparto, usa as?

 val num = unknown as? Int // null if it is not Int 

El problema es que Int::class refiere al tipo int primitivo, pero el valor es el tipo Integer .

Una solución alternativa es utilizar Integer::class lugar de Int::class , ya que esto se referirá al tipo de Java encuadrado.

Para ser más genérico, podría usar un ayudante como Apache Commons ClassUtils.primitiveToWrapper() , o mantener un

 fun primitiveToWrapper(clazz: Class<*>): Class<*> = when (clazz) { java.lang.Void.TYPE -> java.lang.Void::class.java java.lang.Boolean.TYPE -> java.lang.Boolean::class.java java.lang.Byte.TYPE -> java.lang.Byte::class.java java.lang.Character.TYPE -> java.lang.Character::class.java java.lang.Short.TYPE -> java.lang.Short::class.java java.lang.Integer.TYPE -> java.lang.Integer::class.java java.lang.Long.TYPE -> java.lang.Long::class.java java.lang.Float.TYPE -> java.lang.Float::class.java java.lang.Double.TYPE -> java.lang.Double::class.java else -> clazz } 

tabla de búsqueda usted mismo. Lamentablemente, no existe un método integrado en Java o Kotlin para get la class contenedora de un tipo primitivo.

 @Suppress("UNCHECKED_CAST") fun <T> castValue(v: Any?, clazz: Class<T>): T? = v?.takeIf(primitiveToWrapper(clazz)::isInstance) as T? 
  • ¿Qué significa el código @TypeConverterAnnotation?
  • Sala: entidades relacionadas - constructor público utilizable
  • EXCEPCIÓN FATAL: RxCachedThreadScheduler-1 cuando el gatillo se deshace. ¿Por qué?
  • Kotlin file para apk flujo de Android?
  • Cómo crear el flask gordo con gradle kotlin script
  • Kotlin getParcelableArray del set de bashs no puede convertirlo en tipo personalizado
  • Cómo usar Realm's en el método con Kotlin
  • Kotlin: instancia única de una class no singleton?
  • No se puede resolver el símbolo kotlinOptions (en la construcción de Gradle)
  • Usando un socket para un protocolo personalizado sobre tcp
  • Kotlin: Collection no tiene tipo genérico ni OneToMany.targetEntity ()