Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于Kotlin中Int::class.java.isInstance()的混淆_Kotlin - Fatal编程技术网

关于Kotlin中Int::class.java.isInstance()的混淆

关于Kotlin中Int::class.java.isInstance()的混淆,kotlin,Kotlin,Int::class.java.isInstance(4)的结果为false 但是String::class.java.isInstance(“aa”)是正确的 在这样的函数中,Int类型检查的正确方法是什么 fun <T> castValue(v: Any?, clazz: Class<T>): T? { if (v != null && clazz.isInstance(v) return v as T return null } val r

Int::class.java.isInstance(4)
的结果为false

但是
String::class.java.isInstance(“aa”)
是正确的

在这样的函数中,
Int
类型检查的正确方法是什么

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)
fun castValue(v:Any?,clazz:Class):T?{
如果(v!=null&&clazz.isInstance(v)将v返回为T
返回空
}
val result=castValue(4,Int::class.java)

问题在于
Int::class
指的是原语
Int
类型,但值是装箱的
整数
类型

解决方法是使用
Integer::class
而不是
Int::class
,因为这将引用装箱的Java类型

更一般地说,您可以使用类似的助手,或者维护

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
}
趣味原语说唱歌手(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 } 不幸的是,Java或Kotlin中没有内置方法来获取原始类型的包装器类

@Suppress("UNCHECKED_CAST")
fun <T> castValue(v: Any?, clazz: Class<T>): T? =
    v?.takeIf(primitiveToWrapper(clazz)::isInstance) as T?
@Suppress(“未选中的\u CAST”)
有趣的价值观(v:有吗?课堂):T=
v?.takeIf(原始说话者)(clazz)::isInstance)作为T?

::class.java
是调用java方法而不是Kotlin

如果要测试类型,请使用
is

val isInt = 1 is Int // true
如果要尝试强制转换,请使用
as?

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

您可以使用
具体化的
类型参数来实现这一点:

inline fun <reified T> cast(value:Any?): T? = value as? T
inlinefuncast(值:Any?:T?=值为?T
这样称呼它:

cast(假)