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 TypeTokenpuis obtient le Java à Typepartir de cela. Ensuite, la Gson().fromJsonméthode a besoin du type spécifié pour le résultat de la fonction (qui doit correspondre à celui TypeTokencréé). Deux versions de ce travail, comme ci-dessus ou:
val turns: List<Turns> = Gson().fromJson(pref.turns, turnsType)
Pour faciliter la création du, TypeTokenvous 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' Gsoninstance:
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 TypeTokentout:
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 TypeTokenet également faire l'appel à Gson
               
              
inline fun <reified T> genericType() = object: TypeToken<T>() {}.type