Cela résout le problème:
val turnsType = object : TypeToken<List<Turns>>() {}.type
val turns = Gson().fromJson<List<Turns>>(pref.turns, turnsType)
La première ligne crée une expression d'objet qui descend de TypeToken
puis obtient le Java à Type
partir de cela. Ensuite, la Gson().fromJson
méthode a besoin du type spécifié pour le résultat de la fonction (qui doit correspondre à celui TypeToken
créé). Deux versions de ce travail, comme ci-dessus ou:
val turns: List<Turns> = Gson().fromJson(pref.turns, turnsType)
Pour faciliter la création du, TypeToken
vous pouvez créer une fonction d'assistance, qui doit être en ligne pour pouvoir utiliser des paramètres de type réifiés :
inline fun <reified T> genericType() = object: TypeToken<T>() {}.type
Qui peut ensuite être utilisé de l'une de ces manières:
val turnsType = genericType<List<Turns>>()
// or
val turnsType: List<Turns> = genericType()
Et l'ensemble du processus peut être enveloppé dans une fonction d'extension pour l' Gson
instance:
inline fun <reified T> Gson.fromJson(json: String) = this.fromJson<T>(json, object: TypeToken<T>() {}.type)
Pour que vous puissiez simplement appeler Gson et ne pas vous inquiéter du TypeToken
tout:
val turns = Gson().fromJson<Turns>(pref.turns)
// or
val turns: Turns = Gson().fromJson(pref.turns)
Ici, Kotlin utilise l'inférence de type d'un côté de l'affectation ou de l'autre, et des génériques réifiés pour qu'une fonction en ligne passe par le type complet (sans effacement), et l'utilise pour construire un TypeToken
et également faire l'appel à Gson
inline fun <reified T> genericType() = object: TypeToken<T>() {}.type