Это решает проблему:
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)
Здесь Kotlin использует вывод типа с одной стороны присваивания или другой, и повторно использует универсальные шаблоны для встроенной функции, чтобы пройти через полный тип (без стирания), и использовать это для создания, TypeToken
а также для вызова Gson
inline fun <reified T> genericType() = object: TypeToken<T>() {}.type