Це вирішує проблему:
val turnsType = object : TypeToken<List<Turns>>() {}.type
val turns = Gson().fromJson<List<Turns>>(pref.turns, turnsType)
Перший рядок створює вираження об'єкта, яке сходить з, TypeTokenа потім отримує від цього Java Type. Тоді Gson().fromJsonметоду або потрібен тип, вказаний для результату функції (який повинен відповідати TypeTokenствореному). Дві версії цього твору, як вище, або:
val turns: List<Turns> = Gson().fromJson(pref.turns, turnsType)
Щоб полегшити створення, TypeTokenви можете створити допоміжну функцію, яка повинна бути вбудованою, щоб вона могла використовувати параметри повторного типу :
inline fun <reified T> genericType() = object: TypeToken<T>() {}.type
Потім їх можна використовувати будь-яким із цих способів:
val turnsType = genericType<List<Turns>>()
// or
val turnsType: List<Turns> = genericType()
І весь процес можна перетворити на функцію розширення для Gsonекземпляра:
inline fun <reified T> Gson.fromJson(json: String) = this.fromJson<T>(json, object: TypeToken<T>() {}.type)
Так що ви можете просто зателефонувати в Gson і зовсім не турбуватися про TypeToken:
val turns = Gson().fromJson<Turns>(pref.turns)
// or
val turns: Turns = Gson().fromJson(pref.turns)
Тут Котлін використовує висновок типу з однієї сторони присвоєння або з іншого, і вдосконалив дженерики для вбудованої функції, щоб пройти через повний тип (без стирання), і використовуючи цю функцію для побудови а, TypeTokenа також для виклику в Gson
inline fun <reified T> genericType() = object: TypeToken<T>() {}.type