Dies löst das Problem:
val turnsType = object : TypeToken<List<Turns>>() {}.type
val turns = Gson().fromJson<List<Turns>>(pref.turns, turnsType)
Die erste Zeile erstellt einen Objektausdruck , der von diesem abstammt TypeTokenund dann Java Typeabruft. Dann benötigt die Gson().fromJsonMethode entweder den für das Ergebnis der Funktion angegebenen Typ (der mit dem TypeTokenerstellten übereinstimmen sollte ). Zwei Versionen dieser Arbeit, wie oben oder:
val turns: List<Turns> = Gson().fromJson(pref.turns, turnsType)
Um das Erstellen der zu vereinfachen, TypeTokenkönnen Sie eine Hilfsfunktion erstellen, die inline sein muss, damit sie Parameter mit geändertem Typ verwenden kann :
inline fun <reified T> genericType() = object: TypeToken<T>() {}.type
Was dann auf eine der folgenden Arten verwendet werden kann:
val turnsType = genericType<List<Turns>>()
// or
val turnsType: List<Turns> = genericType()
Und der gesamte Prozess kann in eine Erweiterungsfunktion für die GsonInstanz eingebunden werden :
inline fun <reified T> Gson.fromJson(json: String) = this.fromJson<T>(json, object: TypeToken<T>() {}.type)
Damit Sie einfach Gson anrufen können und sich überhaupt keine Sorgen machen müssen TypeToken:
val turns = Gson().fromJson<Turns>(pref.turns)
// or
val turns: Turns = Gson().fromJson(pref.turns)
Hier verwendet Kotlin die Typinferenz von der einen oder der anderen Seite der Zuweisung und reifizierte Generika für eine Inline-Funktion, um den vollständigen Typ (ohne Löschung) zu durchlaufen, und verwendet diese, um einen zu konstruieren TypeTokenund auch Gson aufzurufen
inline fun <reified T> genericType() = object: TypeToken<T>() {}.type