परिचय
`reified` कीवर्ड Kotlin में जेनेरिक टाइप इरेज़र को बायपास करने की अनुमति देता है, लेकिन केवल `inline` फंक्शंस के साथ काम करता है।
समस्या: टाइप इरेज़र
JVM पर जेनेरिक्स रनटाइम पर मिटा दिए जाते हैं:
// यह काम नहीं करेगा - T रनटाइम पर उपलब्ध नहीं funprintType() { // println(T::class) // कंपाइल त्रुटि: Cannot use 'T' as reified type parameter }
समाधान: inline + reified
`inline` फंक्शन का बाइटकोड कॉल साइट पर कॉपी हो जाता है, जिससे वास्तविक टाइप तर्क उपलब्ध हो जाता है।
उदाहरण
// Inline फंक्शन reified टाइप पैरामीटर के साथ inline funprintTypeInfo(value: T) { println("मान: $value") println("टाइप: ${T::class.java}") println("सरल नाम: ${T::class.simpleName}") println("क्या String है? ${T::class.java == String::class.java}") } fun main() { printTypeInfo("Hello World") printTypeInfo(100) printTypeInfo(1L) printTypeInfo(3.14) printTypeInfo(true) }
आउटपुट
मान: Hello World टाइप: class java.lang.String सरल नाम: String क्या String है? true मान: 100 टाइप: class java.lang.Integer सरल नाम: Integer क्या String है? false मान: 1 टाइप: class java.lang.Long सरल नाम: Long क्या String है? false मान: 3.14 टाइप: class java.lang.Double सरल नाम: Double क्या String है? false मान: true टाइप: class java.lang.Boolean सरल नाम: Boolean क्या String है? false
व्यावहारिक उपयोग के मामले
1. JSON पार्सिंग (Gson/Jackson/Moshi)
import com.google.gson.Gson inline funfromJson(json: String): T { return Gson().fromJson(json, T::class.java) } // उपयोग fun main() { val json = """{"name":"John","age":30}""" val user: User = fromJson(json) println(user) } data class User(val name: String, val age: Int)
2. इंटेंट एक्स्ट्रा निकालना (एंड्रॉइड)
// एंड्रॉइड एक्सटेंशन फंक्शन inline funIntent.getExtra(key: String): T? { return getSerializableExtra(key) as? T } // उपयोग // val user: User? = intent.getExtra("user_key")
3. रनटाइम टाइप चेकिंग
inline funisInstance(value: Any): Boolean { return value is T } fun main() { val list: Any = listOf(1, 2, 3) println("क्या List है? ${isInstance >(list)}") // true (इरेज़र के कारण) println("क्या List
है? ${isInstance >(list)}") // true (इरेज़र!) // नोट: जेनेरिक आर्गुमेंट्स अभी भी मिट जाते हैं // केवल रॉ टाइप चेक होता है }
4. क्लास इंस्टेंशिएशन (नो-आर्ग कंस्ट्रक्टर आवश्यक)
inline funcreateInstance(): T where T : Any { return T::class.java.getDeclaredConstructor().newInstance() } data class Config(val name: String = "Default") fun main() { val config: Config = createInstance() println(config) // Config(name=Default) }
सीमाएं
- केवल `inline` फंक्शंस के साथ काम करता है
- जेनेरिक टाइप आर्गुमेंट्स (जैसे `List
`) अभी भी मिट जाते हैं - केवल रॉ टाइप (`List`) उपलब्ध - इनलाइनिंग कोड आकार बढ़ा सकती है - बड़े फंक्शंस के लिए सावधानी से उपयोग करें
- `@PublishedApi` के साथ पब्लिक API में उपयोग न करें
सारांश
- `inline fun
` - रनटाइम पर `T::class` एक्सेस सक्षम करता है - कॉल साइट पर फंक्शन बॉडी इनलाइन हो जाती है
- JSON पार्सिंग, रिफ्लेक्शन, फैक्ट्री मेथड्स के लिए उपयोगी
- जेनेरिक नेस्टेड टाइप्स (`List
` के अंदर `T`) पूरी तरह से उपलब्ध नहीं