无法将类型T用作化参数,请改用类

时间:2019-01-20 03:20:16

标签: android generics kotlin kotlin-reified-type-parameters

Android Studio 3.4
Kotlin 1.3.10

我有以下方法,该方法调用findPreferences以返回存储在共享首选项中的正确值。但是,由于我使用的是reified,因此findPreferences给我一个错误:不能将T类型用作reified参数。

反正我可以使它正常工作吗?

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
    }
}

2 个答案:

答案 0 :(得分:2)

删除sessionStorage或将reified更改为getValue

使用inline fun <reified T: Any> getValue...,我们reifiedhttps://kotlinlang.org/docs/reference/inline-functions.html#reified-type-parameters)。 pass a type to this function要求在编译时知道类型,显然reified中没有足够的类型信息。

答案 1 :(得分:1)

我可能迟到了,但是这是一篇关于共享偏好的简洁文章。本文完全包含您想要实现的代码。看看吧。

https://myprogrammingexperiments.wordpress.com/2017/06/04/manipulating-shared-prefs-with-kotlin-just-two-lines-of-code/