Це вирішує проблему:
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