To rozwiązuje problem:
val turnsType = object : TypeToken<List<Turns>>() {}.type
val turns = Gson().fromJson<List<Turns>>(pref.turns, turnsType)
Pierwsza linia tworzy wyrażenie obiektowe, które pochodzi od, TypeToken
a następnie pobiera z niego Javę Type
. Następnie Gson().fromJson
metoda wymaga albo typu określonego dla wyniku funkcji (który powinien pasować do TypeToken
utworzonej). Dwie wersje tej pracy, jak wyżej lub:
val turns: List<Turns> = Gson().fromJson(pref.turns, turnsType)
Aby ułatwić tworzenie TypeToken
, możesz utworzyć funkcję pomocniczą, która musi być wbudowana, aby mogła używać parametrów typu reified :
inline fun <reified T> genericType() = object: TypeToken<T>() {}.type
Które można następnie wykorzystać na jeden z następujących sposobów:
val turnsType = genericType<List<Turns>>()
// or
val turnsType: List<Turns> = genericType()
Cały proces można opakować w funkcję rozszerzającą dla Gson
instancji:
inline fun <reified T> Gson.fromJson(json: String) = this.fromJson<T>(json, object: TypeToken<T>() {}.type)
Abyś mógł po prostu zadzwonić do Gson i wcale się nie martwić TypeToken
:
val turns = Gson().fromJson<Turns>(pref.turns)
// or
val turns: Turns = Gson().fromJson(pref.turns)
Tutaj Kotlin używa wnioskowania o typie z jednej lub drugiej strony przypisania i reified generics dla funkcji inline, która przechodzi przez pełny typ (bez wymazywania) i używa tego do skonstruowania a, TypeToken
a także wywołania Gson
inline fun <reified T> genericType() = object: TypeToken<T>() {}.type