Kotlin
जेनेरिक्स
खोज…
परिचय
एक सूची संख्या, शब्द या वास्तव में कुछ भी पकड़ सकती है। इसलिए हम सूची को सामान्य कहते हैं ।
जेनेरिक मूल रूप से यह परिभाषित करने के लिए उपयोग किया जाता है कि किस प्रकार का वर्ग धारण कर सकता है और वर्तमान में किस प्रकार की वस्तु धारण करता है।
वाक्य - विन्यास
- वर्ग className <TypeName>
- क्लास क्लासनेम <*>
- ClassName <में UpperBound>
- ClassName <बाहर LowerBound>
- वर्ग का नाम < टाइपनाम : अपरबाउंड >
पैरामीटर
पैरामीटर | विवरण |
---|---|
नाम लिखो | जेनेरिक पैरामीटर का नाम टाइप करें |
ऊपरी सीमा | सहसंयोजक प्रकार |
निम्न परिबंध | कंट्राविरेंट प्रकार |
कक्षा का नाम | वर्ग का नाम |
टिप्पणियों
इंप्लाइड अपर बाउंड अशक्त है
Kotlin Generics में, टाइप पैरामीटर T
की ऊपरी सीमा Any?
होगी Any?
। इसलिए इस वर्ग के लिए:
class Consumer<T>
प्रकार पैरामीटर T
वास्तव में T: Any?
। एक गैर-अशक्त ऊपरी सीमा बनाने के लिए, स्पष्ट रूप से विशिष्ट T: Any
। उदाहरण के लिए:
class Consumer<T: Any>
घोषणा-स्थल का विचरण
घोषणा-स्थल के विचरण को एक बार और सभी उपयोग-स्थलों के लिए उपयोग-स्थल विचरण की घोषणा के रूप में सोचा जा सकता है।
class Consumer<in T> { fun consume(t: T) { ... } }
fun charSequencesConsumer() : Consumer<CharSequence>() = ...
val stringConsumer : Consumer<String> = charSequenceConsumer() // OK since in-projection
val anyConsumer : Consumer<Any> = charSequenceConsumer() // Error, Any cannot be passed
val outConsumer : Consumer<out CharSequence> = ... // Error, T is `in`-parameter
डिक्लेरेशन-साइट विचरण के व्यापक उदाहरण हैं List<out T>
, जो अपरिवर्तनीय है ताकि T
केवल रिटर्न वैल्यू टाइप के रूप में प्रकट हो, और Comparator<in T>
, जो केवल T
को तर्क के रूप में प्राप्त करता है।
उपयोग-स्थल विचरण
उपयोग-साइट विचरण जावा वाइल्डकार्ड के समान है:
बाहर प्रक्षेपण:
val takeList : MutableList<out SomeType> = ... // Java: List<? extends SomeType>
val takenValue : SomeType = takeList[0] // OK, since upper bound is SomeType
takeList.add(takenValue) // Error, lower bound for generic is not specified
इन-प्रक्षेपण:
val putList : MutableList<in SomeType> = ... // Java: List<? super SomeType>
val valueToPut : SomeType = ...
putList.add(valueToPut) // OK, since lower bound is SomeType
putList[0] // This expression has type Any, since no upper bound is specified
स्टार-प्रक्षेपण
val starList : MutableList<*> = ... // Java: List<?>
starList[0] // This expression has type Any, since no upper bound is specified
starList.add(someValue) // Error, lower bound for generic is not specified
यह सभी देखें:
जावा से कोटलिन को कॉल करते समय वेरिएंट जेनरिक इंटरऑपरेबिलिटी।