इससे समस्या हल होती है:
val turnsType = object : TypeToken<List<Turns>>() {}.type
val turns = Gson().fromJson<List<Turns>>(pref.turns, turnsType)
पहली पंक्ति एक ऑब्जेक्ट एक्सप्रेशन बनाती है जो इससे उतरती है TypeTokenऔर फिर उसी से जावा 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)
ताकि आप सिर्फ गन्स को कॉल कर सकें और बिल्कुल भी चिंता न करें TypeToken:
val turns = Gson().fromJson<Turns>(pref.turns)
// or
val turns: Turns = Gson().fromJson(pref.turns)
यहाँ कोटलिन असाइनमेंट के एक तरफ या दूसरे से टाइप इंट्रैक्शन का इस्तेमाल कर रहा है, और इनलाइन फंक्शन के लिए रिवाइज्ड जेनेरिक को फुल टाइप (बिना TypeTokenमिटाये) से गुजरने के लिए इस्तेमाल कर रहा है, और इसका इस्तेमाल करके गन्स को कॉल भी कर सकता है
inline fun <reified T> genericType() = object: TypeToken<T>() {}.type