Kotlin in Hindi – Generics

  • Introduction to kotlin generics in Hindi
  • Kotlin generic types in Hindi

Introduction to Kotlin Generics

सभी advanced और popular programming languages में generics एक बहुत ही common programming feature है। Java में भी यह feature available है। Java में available ज्यादातर सभी built-in classes, interfaces और collections generic type के है। 

Generics से आपको reliability मिलती है। Generics का concept आपको एक ही code को अलग अलग data type के साथ execute करने की capability provide करता है।

Writing Same Code for Different Types 

यह उन situations में महत्वपूर्ण होता है जब आपको data के type का सही अनुमान न हो और यह उन situations में भी उपयोगी होता है जब एक ही प्रकार के code को अलग अलग types के लिए execute करना हो। 

ऐसे में आप किसी code को generic type का बना सकते है ताकि वह एक particular type से bound ना हो कर किसी भी type के साथ execute किया जा सके। इससे फ़ायदा यह होता है की आपको हर particular data type के लिए अलग से code नहीं लिखना होता है। 

उदाहरण के लिए आप एक addition function बनाते है जो दो numbers को add करता है। यदि आप code में type integer define करते है तो ऐसे में वह function सिर्फ integer numbers के साथ ही execute किया जा सकेगा।  

यदि उस function में double या float type की values pass की जाती है तो वह function execute नहीं होगा और error generate होगी। 

इस situation में आप अलग अलग types के numbers को add करने के लिए अलग अलग functions create करने के लिए मजबूर है। हालाँकि उन सभी functions में एक ही प्रकार का code होगा जो दो numbers को add करता है और वह एक ही प्रकार से कार्य करेगा। 

आप अलग अलग types के लिए function create करेंगे जिससे आपके program का code अधिक हो जायेगा और एक programmer के रूप में आप भी बार बार एक ही code को लिखकर परेशान हो जायेंगे। 

इस situation में आप generic feature को use कर सकते है। इस feature को use करते हुए आप एक generic type का addition function create कर सकते है। यह function add करने के लिए दो number arguments के अलावा एक type भी argument के रूप में लेगा और उसी के अनुसार numbers को add कर देगा। 

उदाहरण के लिए float numbers को add करने के लिए float type argument pass किया जायेगा और integer numbers को add करने के लिए integer type argument pass किया जायेगा। 

Executing Same Code With Different Types

Generic feature को implement करके आप एक ही code को अलग अलग types के data के साथ execute कर सकते है। इससे आपका समय बचता है और program की redability बढ़ती है।

आप ऐसी classes, methods और properties define कर सकते है जिन्हे अलग अलग types के data के साथ प्रयोग किया जा सकता है।

Compile Time Type Safety

Kotlin में generic feature type safety से कोई समझौता नहीं करता है। जैसा की आपको पता है kotlin एक type safe programming language है। इसलिए सभी प्रकार के types को compile time पर ही resolve कर लिया जाता है।

उसी प्रकार generic type के classes, methods और properties को pass किये गए types को भी compile time पर ही resolve कर लिया जाता है।

Defined with Type Parameter

जब आप कोई generic code define करते है जो उसमें type parameter को define करते है और उस code को execute करते समय argument के रूप में एक type pass किया जाता है। 

Type parameters define करने के लिए T का प्रयोग किया जाता है। यह type को दर्शाता है और किसी real type के लिए placeholder का कार्य करता है। T को angular brackets <T> define किया जाता है। इस प्रकार सिर्फ headers में ही किया जाता है बाकी जगह आप इस T को directly type की तरह use कर सकते है। 

Generic Classes

Generic class define करने के लिए आप class header में ही type parameter define करते है। इसके बाद उस type parameter T को constructors और class body में real type की तरह use किया जाता है।

class className <T>
{
    //Use T as a type inside class…
}

Execution के समय जब एक real type pass किया जाता है तो T उस real type के द्वारा replace हो जाता है। एक generic class का object create करते समय भी type को angular brackets में pass करते है।

class myClass <T> (n: T)           //A generic class
{
   
}

 

val obj: myClass<String> = myClass<String>(5)     //Creating generic class object

Generic Functions

Classes की ही तरह functions को generic define करने के लिए आप function header में <T> type parameter define करते है।

fun <T> functionName(parameters-list) : returnType
{
    //Use T as type in function body
}

जब आप एक generic function को call करते है तो उस समय type argument के रूप में real type pass किया जाता है।

fun <T> myFunction(n: T):T
{
    return n
}

 

result= myFunction<Int>(5)

Generic Properties

Kotlin में generic properties define करने में समस्या यह होती है की kotlin में properties को initialize किया जाना आवश्यक होता है। क्योंकि generic type define करते समय type unknown रहता है इसलिए property के लिए initializer भी fix नहीं होता है।

var myProperty: T? = Any()

ऐसे में या तो property को Any() के साथ define किया जाए या फिर primary constructor में property को define किया जाये और object create करते समय उसे intialize किया जाये। इससे kotlin compiler किसी प्रकार की error generate नहीं करेगा।

class myClass<T>(val myProeprty: T)
{
     init
     {
           //initialize property here….
     }
}

Variance, Covariance & Contra-variance

जब एक type को किसी sub type या super type को assign किया जाता है तो वह situation variance कहलाती है। Variance अलग अलग programming languages में अलग अलग होता है।

Java में आप एक type को दूसरे type को assign नहीं कर सकते है। Java में generic types में आपस में कोई sub type और super type relationship नहीं है। Java की यह situation in variance कहलाती है।

लेकिन kotlin में ऐसा करना संभव है। Kotlin आपको generic type को किसी sub या super type को assign करने की ability provide करती है। इसके लिए kotlin in और out keyword provide करती है।

Covariance

जब एक generic type को super type को assign किया जाता है तो वह situation covariance कहलाती है। अपने generic code के result को किसी super type के instance से refer करने के लिए आप type parameter को out modifier के साथ define करते है।

class className <out T> (parameter T)
{
      //use T as type
}

Contravariance

जब एक generic type को sub type को assign किया जाता है तो उसे contravariance कहा जाता है। Generic code के result को यदि आप उसके किसी sub type के द्वारा refer करना चाहते है तो इसके लिए आपको type parameter को in modifier के साथ define करना होता है। 

class className <in T> (parameter: T)
{
    //use T as type
}

Previous: Kotlin Inline Classes
Next: Kotlin Packages