Android Kotlin类具体化问题

Android Kotlin类具体化问题,android,kotlin,Android,Kotlin,当我想从SharedReferences中获取int值时,我得到的是UnsupportedOperationException,但我从logcat显示,这个类是int。怎么了 operator inline fun <reified T : Any> get(@XMLS xml: String, @KEYS key: String, defaultValue: T? = null): T { Timber.d("${T::class} + $xml + $key + $def

当我想从SharedReferences中获取int值时,我得到的是
UnsupportedOperationException
,但我从logcat显示,这个类是
int
。怎么了

operator inline fun <reified T : Any> get(@XMLS xml: String, @KEYS key: String, defaultValue: T? = null): T {
    Timber.d("${T::class} + $xml + $key + $defaultValue")
    return when (T::class) {
        String::class -> getShared(xml)?.getString(key, defaultValue as? String ?: "") as? T ?: "" as T
        Int::class -> {
            Timber.d("not triggered") //<<
            getShared(xml)?.getInt(key, defaultValue as? Int ?: -1) as? T ?: -1 as T
        }
        Boolean::class -> getShared(xml)?.getBoolean(key, defaultValue as? Boolean == true) as? T ?: true as T
        Float::class -> getShared(xml)?.getFloat(key, defaultValue as? Float ?: -1f) as? T ?: -1f as T
        Long::class -> getShared(xml)?.getLong(key, defaultValue as? Long ?: -1) as? T ?: -1 as T
        else -> throw UnsupportedOperationException("unknown class!")
    }
}

这是失败的,因为
Int::class
是原语
Int
,而
T::class
是装箱类型
java.lang.Integer
。这两个类的
KClass
看起来都像
kotlin.Int
,所以很难区分它们之间的区别

尽管看起来有点奇怪,但这仍然有效:

when (T::class) {
    Int::class, Integer::class ->
}

(为了清楚起见,我将
Int
留在那里,即使它永远不会触发。)

因为您将
T
声明为
any
的任何子类,并且您只需使用
T
检查该类,为什么不接受值作为
Any
类型而不是泛型类型,并使用
is
检查类?我宁愿将此函数拆分为多个函数,因为类型之间共享的代码并不多(即使默认值也不同),另外一个问题是,这个函数是内联的,因此对于代码中的每个地方,如果您要使用它从首选项中读取值,编译器将用完整的函数体(包括开关盒)替换数组访问,是的,但是具体化类型需要内联关键字,否则ide将出现错误
when (T::class) {
    Int::class, Integer::class ->
}