Ini menyelesaikan masalah:
val turnsType = object : TypeToken<List<Turns>>() {}.type
val turns = Gson().fromJson<List<Turns>>(pref.turns, turnsType)
Baris pertama membuat ekspresi objek yang diturunkan dari TypeToken
dan kemudian mendapatkan Java Type
darinya. Kemudian Gson().fromJson
metode tersebut membutuhkan tipe yang ditentukan untuk hasil fungsi (yang harus cocok dengan yang TypeToken
dibuat). Dua versi dari karya ini, seperti di atas atau:
val turns: List<Turns> = Gson().fromJson(pref.turns, turnsType)
Untuk mempermudah pembuatannya, TypeToken
Anda bisa membuat fungsi helper, yang harus inline agar bisa menggunakan parameter tipe reified :
inline fun <reified T> genericType() = object: TypeToken<T>() {}.type
Yang kemudian dapat digunakan dengan salah satu cara berikut:
val turnsType = genericType<List<Turns>>()
// or
val turnsType: List<Turns> = genericType()
Dan seluruh proses dapat digabungkan menjadi fungsi ekstensi untuk Gson
contoh:
inline fun <reified T> Gson.fromJson(json: String) = this.fromJson<T>(json, object: TypeToken<T>() {}.type)
Sehingga Anda dapat menelepon Gson dan tidak khawatir tentang hal tersebut TypeToken
:
val turns = Gson().fromJson<Turns>(pref.turns)
// or
val turns: Turns = Gson().fromJson(pref.turns)
Di sini Kotlin menggunakan inferensi tipe dari satu sisi tugas atau sisi lainnya, dan reifikasi generik untuk fungsi sebaris agar melewati tipe lengkap (tanpa penghapusan), dan menggunakannya untuk membuat TypeToken
dan juga melakukan panggilan ke Gson
inline fun <reified T> genericType() = object: TypeToken<T>() {}.type