generics - 如何在 Kotlin 中将 TypeToken + 泛型与 Gson 一起使用

我无法从自定义类 (Turns) 中获取泛型类型列表:

val turnsType = TypeToken<List<Turns>>() {}.type
val turns = Gson().fromJson(pref.turns, turnsType)

它说:

cannot access '<init>' it is 'public /*package*/' in 'TypeToken'

最佳答案

创建这个内联乐趣:

inline fun <reified T> Gson.fromJson(json: String) = fromJson<T>(json, object: TypeToken<T>() {}.type)

然后就可以这样调用了:

val turns = Gson().fromJson<Turns>(pref.turns)
// or
val turns: Turns = Gson().fromJson(pref.turns)

以前的替代品:

备选方案 1:

val turnsType = object : TypeToken<List<Turns>>() {}.type
val turns = Gson().fromJson<List<Turns>>(pref.turns, turnsType)

你必须把 object :以及 fromJson<List<Turns>> 中的具体类型


备选方案 2:

正如@cypressious 提到的,它也可以通过这种方式实现:

inline fun <reified T> genericType() = object: TypeToken<T>() {}.type

用作:

val turnsType = genericType<List<Turns>>()

https://stackoverflow.com/questions/33381384/

相关文章:

syntax - Kotlin 中的变量名或扩展运算符之前的 Kotlin 星号运算符

loops - Kotlin 中 `break` 中的 `continue` 和 `forEach`

kotlin - 在 Kotlin 中创建抽象类的实例

kotlin - Kotlin 中有构造函数引用吗?

java - Kotlin:等效于 KClass 的 getClass()

function - 何时在 Kotlin 中使用内联函数?

kotlin - 覆盖 Kotlin 数据类的 getter

kotlin - "experimental"Kotlin协程可以在生产中使用吗?

android - Kotlin Android 启动新 Activity

enums - Kotlin 中具有反向查找的有效枚举?