首页 > 解决方案 > 不能将类型 T 用作具体化参数,请改用类

问题描述

Android Studio 3.4
Kotlin 1.3.10

我有以下方法调用 findPreferences 以返回存储在共享首选项中的正确值。但是,当我使用 reified 时,findPreferences 给了我一个错误:Cannot use type T as a reified parameter。

无论如何我可以让它工作吗?

fun <T: Any> getValue(key: String, defaultValue: T?): T {
    return findPreferences(key, defaultValue)
}

这是将基于键返回值的方法

@Suppress("unchecked_cast")
inline fun <reified  T: Any> findPreferences(key: String, defaultValue: T?): T {
    with(sharedPreferences) {
        val result: Any = when(defaultValue) {
            is Boolean -> getBoolean(key, default)
            is Int -> getInt(key, defaultValue)
            is Long -> getLong(key, defaultValue)
            is Float -> getFloat(key, defaultValue)
            is String -> getString(key, defaultValue)
            else -> {
                 throw UnsupportedOperationException("Cannot find preference casting error")
            }
        }
        return result as T
    }
}

标签: androidgenericskotlinkotlin-reified-type-parameters

解决方案


删除reified或更改getValueinline fun <reified T: Any> getValue....

有了reified,我们pass a type to this functionhttps://kotlinlang.org/docs/reference/inline-functions.html#reified-type-parameters)。reified需要在编译时知道类型,显然getValue.


推荐阅读