Это решает проблему:
val turnsType = object : TypeToken<List<Turns>>() {}.type
val turns = Gson().fromJson<List<Turns>>(pref.turns, turnsType)
Первая строка создает object expression, которая сходит с TypeToken
и th en получает Java Type
. Затем методу Gson().fromJson
нужен либо тип, указанный для результата функции (который должен соответствовать созданному TypeToken
).Два варианта этой работы, как и выше, или:
val turns: List<Turns> = Gson().fromJson(pref.turns, turnsType)
Чтобы сделать его проще создать TypeToken
вы можете создать вспомогательную функцию, которая необходима, чтобы быть inline так, что он может использовать reified type parameters:
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
Вы также можете создать вспомогательный метод, который делает это для вас: 'инлайн весело GenericType() = объект: TypeToken () {} .type' –
или даже расширяет Gson иметь новую перегрузку fromJson, что делает это , Kotlin предназначен для расширения, поэтому продлить Gson, чтобы сделать его лучше и скрыть TypeTokens. –
Я сделал предлагаемое редактирование, которое делает ответ более полным и формальным, так как этот ответ, вероятно, будет замечен многими, кто использует Gson. Я добавил объяснения в ответ и ссылки на ссылки Котлина на темы, используемые для решения проблемы ... так что людям не нужно читать все остальные ответы или комментарии, которые касаются этого. Если вы примете редактирование, я смогу удалить свой ответ ниже. –