的問題是,Int::class
指原始int
類型,但價值是盒裝Integer
類型。
解決方法是使用Integer::class
而不是Int::class
,因爲這將引用裝箱的Java類型。
更通用的,你可以使用一個輔助像Apache Commons ClassUtils.primitiveToWrapper()
,或自己保持
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
}
查找表。不幸的是,Java或Kotlin沒有內置方法來獲取基本類型的包裝類。
@Suppress("UNCHECKED_CAST")
fun <T> castValue(v: Any?, clazz: Class<T>): T? =
v?.takeIf(primitiveToWrapper(clazz)::isInstance) as T?
@YoungZhao如果您將其標記爲接受,如果它解決了您的問題,我會很高興。 –