一尘不染

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

gson

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

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

它说:

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

阅读 261

收藏
2022-05-27

共1个答案

一尘不染

创建这个内联乐趣:

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>>()
2022-05-27