Это решает проблему:
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