2017-09-06 72 views
1

Int::class.java.isInstance(4)的結果爲false。關於Kotlin中Int :: class.java.isInstance()的混淆

但是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) 

回答

1

你可以做到這一點使用reified類型參數:

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

並且這樣稱呼它:

cast<Boolean>(false)

+0

@YoungZhao如果您將其標記爲接受,如果它解決了您的問題,我會很高興。 –

0

的問題是,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? 
1

::class.java是調用Java方法而不是Kotlin。

如果你想測試的類型,使用is

val isInt = 1 is Int // true 

如果你想嘗試施放,使用as?

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