关于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(假)