Isso resolve o problema:
val turnsType = object : TypeToken<List<Turns>>() {}.type
val turns = Gson().fromJson<List<Turns>>(pref.turns, turnsType)
A primeira linha cria uma expressão de objeto que desce TypeToken
e obtém o Java a Type
partir dela . Então, o Gson().fromJson
método precisa do tipo especificado para o resultado da função (que deve corresponder ao TypeToken
criado). Duas versões deste trabalho, como acima ou:
val turns: List<Turns> = Gson().fromJson(pref.turns, turnsType)
Para facilitar a criação de, TypeToken
você pode criar uma função auxiliar, que deve estar embutida para que possa usar parâmetros de tipo reificado :
inline fun <reified T> genericType() = object: TypeToken<T>() {}.type
Que pode então ser usado de uma destas maneiras:
val turnsType = genericType<List<Turns>>()
// or
val turnsType: List<Turns> = genericType()
E todo o processo pode ser envolvido em uma função de extensão para a Gson
instância:
inline fun <reified T> Gson.fromJson(json: String) = this.fromJson<T>(json, object: TypeToken<T>() {}.type)
Para que você possa apenas ligar para Gson e não se preocupar com TypeToken
nada:
val turns = Gson().fromJson<Turns>(pref.turns)
// or
val turns: Turns = Gson().fromJson(pref.turns)
Aqui, Kotlin está usando inferência de tipo de um lado da atribuição ou do outro, e genéricos reificados para que uma função inline passe pelo tipo completo (sem apagamento) e usando isso para construir um TypeToken
e também fazer a chamada para Gson
inline fun <reified T> genericType() = object: TypeToken<T>() {}.type