الدوال العامة وقيود الأنواع باستخدام where
اكتب دوال عامة باستخدام قيد واحد أو عدة قيود للأنواع.
الدوال العامة وقيود الأنواع باستخدام where درس مجاني في Kotlin Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في 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 هذه القيود في موضع الاستدعاء.
الأسئلة الشائعة
هل درس «الدوال العامة وقيود الأنواع باستخدام where» مجاني؟
نعم — نص درس «الدوال العامة وقيود الأنواع باستخدام where» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Kotlin Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Kotlin Academy 4 دروس في المجموع.
ماذا ستتعلم في «الدوال العامة وقيود الأنواع باستخدام where»؟
اكتب دوال عامة باستخدام قيد واحد أو عدة قيود للأنواع. تتمرن على Kotlin Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Kotlin Academy؟
لا تُشترط خبرة سابقة. Kotlin Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «الدوال العامة وقيود الأنواع باستخدام where»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Kotlin Academy هذا؟
نعم. كل درس في Kotlin Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الدوال العامة وقيود الأنواع باستخدام where
- التباين في موضع التصريح: in وout
- إسقاط النجمة ومتى تستخدم *
- محو النوع ومعاملات النوع reified