android - 不能将类型 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
}
}
解决方案
删除reified
或更改getValue
为inline fun <reified T: Any> getValue...
.
有了reified
,我们pass a type to this function
(https://kotlinlang.org/docs/reference/inline-functions.html#reified-type-parameters)。reified
需要在编译时知道类型,显然getValue
.
推荐阅读
- python - 从值为 NULL 的 DATETIME 获取结果时出现 python mariadb 连接器错误
- javascript - 如何从数组中获取一个随机项?
- c# - 为什么在 ICollection 中使用索引
微软文档中的接口实现示例,如果不能使用怎么办? - c# - 在 c# (linux) 中找不到 PrivateFontCollection 错误
- php - 如何在laravel中的excel上的marge列上显示边框
- php - 我想计算第 2 行和第 1 行的减法
- node.js - Nginx 代理到 node.js 服务器 SSL ERR_SSL_PROTOCOL_ERROR
- c# - ASP.Net Core 异步任务随机停止
- pdf - 当pdftable达到pdf页面的90%时如何限制pdftable中的数据行
- javascript - 是否可以在浏览器 javascript 中使用 selenium-webdriver 和 Vue.js?