इससे समस्या हल होती है:
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