Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Android

Kotlin में reified कीवर्ड कैसे काम करता है?

परिचय

`reified` कीवर्ड Kotlin में जेनेरिक टाइप इरेज़र को बायपास करने की अनुमति देता है, लेकिन केवल `inline` फंक्शंस के साथ काम करता है।

समस्या: टाइप इरेज़र

JVM पर जेनेरिक्स रनटाइम पर मिटा दिए जाते हैं:

// यह काम नहीं करेगा - T रनटाइम पर उपलब्ध नहीं
fun  printType() {
    // println(T::class)  // कंपाइल त्रुटि: Cannot use 'T' as reified type parameter
}

समाधान: inline + reified

`inline` फंक्शन का बाइटकोड कॉल साइट पर कॉपी हो जाता है, जिससे वास्तविक टाइप तर्क उपलब्ध हो जाता है।

उदाहरण

// Inline फंक्शन reified टाइप पैरामीटर के साथ
inline fun  printTypeInfo(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 fun  fromJson(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 fun  Intent.getExtra(key: String): T? {
    return getSerializableExtra(key) as? T
}

// उपयोग
// val user: User? = intent.getExtra("user_key")

3. रनटाइम टाइप चेकिंग

inline fun  isInstance(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 fun  createInstance(): 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`) पूरी तरह से उपलब्ध नहीं
  1. वाईफाई मेश नेटवर्क क्या है, इसके लिए क्या है और यह कैसे काम करता है? वाईफाई मेश नेटवर्क क्या है, इसके लिए क्या है और यह कैसे काम करता है?

    आज, घरों और कार्यालयों में उपकरणों की एक विस्तृत विविधता होती है जो दैनिक कार्यों को पूरा करने के लिए आवश्यक होती है; उदाहरण के लिए हमारे पास कई टेलीविजन, कंप्यूटर, टैबलेट, मोबाइल, स्मार्ट स्पीकर हैं; सभी एक ही राउटर से जुड़े हुए हैं। लेकिन, अच्छे इंटरनेट कनेक्शन के लिए वाईफाई मेश नेटवर्क का उपयोग क

  1. YouTube के रिकमेंडेशन इंजन के अंदर: एल्गोरिदम वीडियो कैसे चुनता है YouTube के रिकमेंडेशन इंजन के अंदर: एल्गोरिदम वीडियो कैसे चुनता है

    YouTube का अनुशंसित अनुभाग वह जगह है जहां लोग अक्सर नए वीडियो देखने के लिए जाते हैं। यहां वीडियो उपयोगकर्ता के अनुरूप होते हैं ताकि वे उन वीडियो पर क्लिक करें जो YouTube को लगता है कि वे देखने की सबसे अधिक संभावना रखते हैं। लेकिन वास्तव में इन वीडियो को कैसे चुना जाता है? अधिकांश लोग इस प्रक्रिया को

  1. Windows, Mac, Android, और iOS पर  नॉट इक्वल  (≠) सिंबल कैसे टाइप करें Windows, Mac, Android, और iOS पर 'नॉट इक्वल' (≠) सिंबल कैसे टाइप करें

    डज नॉट इक्वल सिंबल, या ≠, अक्सर स्टैंडर्ड कीबोर्ड सेटअप का हिस्सा नहीं होता - या यह अच्छी तरह छिपा होता है। तो अगर आपको इसे लिखने की आवश्यकता है, तो आप इसे कैसे करते हैं? डेस्कटॉप डिवाइस पर नॉट इक्वल साइन कैसे लिखें Windows पर: कैरेक्टर मैप का उपयोग करें कैरेक्टर मैप एक उपयोगी यूटिलिटी है जिससे आप स