Android Kotlin类具体化问题
当我想从SharedReferences中获取int值时,我得到的是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
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 ->
}