Kotlin Academy · पाठ

where के साथ Generic Functions और Type Constraints

एकल और अनेक type constraints वाले generic functions लिखें।

पाठ 1, कुल 4 में से13 चरण

where के साथ Generic Functions और Type Constraints, CoddyKit पर Kotlin Academy का एक निःशुल्क पाठ है। यह 4 में से 1वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह Kotlin Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Kotlin Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

जेनेरिक फ़ंक्शन की मूल बातें

जेनेरिक फ़ंक्शन फ़ंक्शन के नाम से पहले कोणीय कोष्ठकों में टाइप पैरामीटर का उपयोग करते हैं। टाइप पैरामीटर का उपयोग पैरामीटर प्रकारों और रिटर्न प्रकारों में किया जा सकता है।

fun <T> identity(value: T): T = value
fun <T> listOf2(a: T, b: T): List<T> = listOf(a, b)
fun main() {
    println(identity(42))       // 42
    println(identity("hello"))  // hello
    println(listOf2(1, 2))      // [1, 2]
}

: प्रतिबंध के साथ ऊपरी सीमाएँ

: का उपयोग करके टाइप पैरामीटर पर ऊपरी सीमा लगाएँ। प्रकार उस सीमा का उपप्रकार होना चाहिए।

fun <T : Comparable<T>> max(a: T, b: T): T = if (a >= b) a else b
fun main() {
    println(max(3, 7))          // 7
    println(max("apple", "banana")) // banana
    // max(listOf(1), listOf(2)) // error: List is not Comparable
}

नल-योग्य ऊपरी सीमा

डिफ़ॉल्ट ऊपरी सीमा Any? होती है और यह नल-योग्य है। नल को बाहर रखने के लिए T : Any का उपयोग करें।

fun <T : Any> notNull(value: T?): T {
    return value ?: throw IllegalArgumentException("Value is null")
}
fun main() {
    println(notNull("hello"))  // hello
    try { notNull(null) } catch (e: Exception) { println(e.message) }
}

where के साथ अनेक प्रतिबंध

एक ही टाइप पैरामीटर पर अनेक प्रतिबंध लगाने के लिए where क्लॉज़ का उपयोग करें।

fun <T> process(item: T): String
        where T : Comparable<T>, T : CharSequence {
    return "Length=${item.length}, sorted=${item > "a"}"
}
fun main() {
    println(process("kotlin")) // Length=6, sorted=true
    // process(42) // error: Int doesn't implement CharSequence
}

क्लास पर where

where क्लॉज़ क्लास-स्तरीय टाइप पैरामीटर पर भी काम करता है।

class SortedContainer<T>(private val items: MutableList<T> = mutableListOf())
        where T : Comparable<T>, T : Any {
    fun add(item: T) { items.add(item); items.sort() }
    fun top(): T? = items.lastOrNull()
}
fun main() {
    val c = SortedContainer<Int>()
    c.add(5); c.add(2); c.add(8)
    println(c.top()) // 8
}

जेनेरिक एक्सटेंशन फ़ंक्शन

एक्सटेंशन फ़ंक्शन में भी टाइप पैरामीटर हो सकते हैं, जिससे वे विशिष्ट जेनेरिक प्रकारों पर उपलब्ध हो जाते हैं।

fun <T : Comparable<T>> List<T>.second(): T? {
    return if (size >= 2) this[1] else null
}
fun main() {
    println(listOf(10, 20, 30).second()) // 20
    println(listOf("a").second())        // null
}

रिटर्न स्थान में टाइप पैरामीटर

जेनेरिक फ़ंक्शन संदर्भ से प्रकार का अनुमान लगा सकते हैं, इसलिए कॉल करने वाले स्थान पर स्पष्ट टाइप आर्ग्युमेंट देने की आवश्यकता नहीं होती।

fun <T> MutableList<T>.popOrDefault(default: T): T {
    return if (isEmpty()) default else removeAt(lastIndex)
}
fun main() {
    val list = mutableListOf(1, 2, 3)
    println(list.popOrDefault(0)) // 3
    println(list.popOrDefault(0)) // 2
    println(mutableListOf<Int>().popOrDefault(-1)) // -1
}

पुन: उपयोग योग्य जेनेरिक यूटिलिटी

जेनेरिक फ़ंक्शन बिना कोड दोहराए विभिन्न प्रकारों में यूटिलिटी फ़ंक्शन का पुन: उपयोग संभव बनाते हैं।

fun <T> Iterable<T>.firstOrElse(default: T): T = firstOrNull() ?: default
fun <T, R : Comparable<R>> Iterable<T>.maxByOrElse(selector: (T) -> R, default: T): T =
    maxByOrNull(selector) ?: default
fun main() {
    println(listOf<String>().firstOrElse("fallback")) // fallback
    println(listOf("a","bbb","cc").maxByOrElse({ it.length }, "")) // bbb
}

स्टार प्रोजेक्शन बनाम सीमित वाइल्डकार्ड

सीमित टाइप पैरामीटर के उपयोग की तुलना करें—यह तब उपयोगी है जब आपको T उत्पन्न या ग्रहण करना हो—और स्टार प्रोजेक्शन से, जिसका उपयोग तब होता है जब प्रकार अज्ञात हो।

fun <T : Number> sumList(list: List<T>): Double =
    list.sumOf { it.toDouble() }
// Star projection: read-only, type unknown
fun printAll(list: List<*>) = list.forEach { println(it) }
fun main() {
    println(sumList(listOf(1, 2, 3)))    // 6.0
    printAll(listOf("a", 1, true))       // a, 1, true
}

जेनेरिक युग्म अदला-बदली

यह एक सरल लेकिन उपयोगी जेनेरिक फ़ंक्शन है, जो Pair के घटकों का क्रम उलट देता है।

fun <A, B> Pair<A, B>.swap(): Pair<B, A> = Pair(second, first)
fun main() {
    val pair = Pair("hello", 42)
    val swapped = pair.swap()
    println(swapped) // (42, hello)
}

व्यावहारिक उदाहरण: जेनेरिक Result अनरैपर

प्रकार-युक्त रूपांतरण के साथ Result<T> पर मैप करने वाली यूटिलिटी लिखने के लिए सीमित जेनेरिक का उपयोग करें।

fun <T : Any, R : Any> Result<T>.mapNotNull(transform: (T) -> R?): Result<R> {
    return fold(
        onSuccess = { v ->
            val r = transform(v)
            if (r != null) Result.success(r) else Result.failure(NoSuchElementException())
        },
        onFailure = { Result.failure(it) }
    )
}
fun main() {
    val r = Result.success("123")
    val n = r.mapNotNull { it.toIntOrNull() }
    println(n) // Success(123)
}

त्वरित जाँच

एक टाइप पैरामीटर पर अनेक प्रतिबंध कैसे लागू करते हैं?

पुनरावलोकन

जेनेरिक फ़ंक्शन पुन: उपयोग योग्य और प्रकार-सुरक्षित कोड लिखने के लिए टाइप पैरामीटर का उपयोग करते हैं। एक सीमा के लिए : और अनेक सीमाओं के लिए where से प्रतिबंध लगाएँ। Kotlin कंपाइलर कॉल करने वाले स्थान पर इन प्रतिबंधों को लागू करता है।

शुरुआत निःशुल्क

एआई शिक्षक के साथ Kotlin सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
51
पाठ
203

अक्सर पूछे जाने वाले प्रश्न

क्या “where के साथ Generic Functions और Type Constraints” पाठ निःशुल्क है?

हाँ — Kotlin Academy अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “where के साथ Generic Functions और Type Constraints” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। Kotlin Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“where के साथ Generic Functions और Type Constraints” में मैं क्या सीखूँगा?

एकल और अनेक type constraints वाले generic functions लिखें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Kotlin Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Kotlin Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Kotlin Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 1वाँ पाठ है।

“where के साथ Generic Functions और Type Constraints” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Kotlin Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Kotlin Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. where के साथ Generic Functions और Type Constraints
  2. Declaration-Site Variance: in और out
  3. Star Projection और * का उपयोग कब करें
  4. Type Erasure और reified Type Parameters
← Kotlin Academy पर वापस जाएँ