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 TypeToken
und dann Java Type
abruft. Dann benötigt die Gson().fromJson
Methode entweder den für das Ergebnis der Funktion angegebenen Typ (der mit dem TypeToken
erstellten übereinstimmen sollte ). Zwei Versionen dieser Arbeit, wie oben oder:
val turns: List<Turns> = Gson().fromJson(pref.turns, turnsType)
Um das Erstellen der zu vereinfachen, TypeToken
kö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 Gson
Instanz 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 TypeToken
und auch Gson aufzurufen
inline fun <reified T> genericType() = object: TypeToken<T>() {}.type