এটি সমস্যার সমাধান করে:
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