التباين في موضع الاستخدام
إسقاطات الأنواع
التباين في موضع الاستخدام درس مجاني في Kotlin Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Kotlin Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Kotlin Academy 4 دروس في المجموع.
التباين على مستوى الاستخدام
أحيانًا تكون الفئة العامة غير متباينة ككل، لكن دالة محددة تنتج النوع أو تستهلكه فقط. يطبّق التباين على مستوى الاستخدام، أو إسقاطات الأنواع، out أو in مباشرةً في موضع استخدام النوع.
لماذا نستخدم التباين على مستوى الاستخدام؟
لا يمكن جعل فئة غير متباينة مثل MutableList<T> متغايرة عند التصريح بها، لأنها تقرأ T وتكتبها معًا. لكن قد تقرأ دالة معينة منها فقط، وتتيح لنا الإسقاطات التعبير عن ذلك بأمان.
إسقاط out
تؤدي كتابة Array<out T> باعتبارها نوع معامل إلى إنشاء عرض متغاير: يمكنك قراءة T، لكن لا يمكنك الكتابة فيه. ويتيح لك ذلك تمرير Array<String> عندما يكون المتوقع هو Array<out Any>.
fun printArray(items: Array<out Any>) {
for (item in items) println(item)
}
fun main() {
val names: Array<String> = arrayOf("Ann", "Bob")
printArray(names)
}القراءة فقط
مع إسقاط out، يسمح المصرّف بالقراءة، أي الإخراج، لكنه يمنع الكتابة، أي الإدخال، لأن الكتابة قد تخرق أمان الأنواع في المصفوفة الأصلية.
إسقاط in
تؤدي كتابة Array<in T> إلى إنشاء عرض متباين عكسيًا: يمكنك كتابة T فيه، لكن تتم قراءة القيم باعتبارها Any?. ويتيح لك ذلك قبول مصفوفات من النوع T أو من أي نوع أعلى منه.
fun fill(dest: Array<in Int>, value: Int) {
for (i in dest.indices) dest[i] = value
}
fun main() {
val numbers: Array<Number> = arrayOf(0, 0, 0)
fill(numbers, 7)
println(numbers.toList())
}الكتابة فقط
مع إسقاط in، يمكنك كتابة قيم من النوع T، أي الإدخال، لكن يُنظر إلى نوع العنصر عند القراءة على أنه النوع الأعلى، لأن نوع العنصر الفعلي قد يكون أي نوع أعلى.
الإسقاطات مقارنةً بالتباين على مستوى التصريح
يُطبَّق التباين على مستوى التصريح، مثل class Box<out T>، في كل موضع تُستخدم فيه الفئة. أما إسقاطات الأنواع على مستوى الاستخدام، مثل Box<out T> باعتباره معاملًا، فتُطبَّق في ذلك الموضع وحده. استخدم الإسقاطات عندما يجب أن تظل الفئة نفسها غير متباينة.
إسقاط النجمة
عندما لا يهمك نوع الوسيط على الإطلاق، استخدم إسقاط النجمة *. تعني List<*> قائمةً من نوع غير معروف؛ ويمكنك قراءة العناصر باعتبارها من النوع ذي الحد الأعلى، لكن لا يمكنك الكتابة فيها بأمان.
fun printSize(collection: List<*>) {
println("Size: ${collection.size}")
}
fun main() {
printSize(listOf(1, 2, 3))
printSize(listOf("a", "b"))
}حدود إسقاط النجمة
باستخدام *، يمكنك استدعاء الأعضاء المستقلة عن النوع، مثل size، وقراءة العناصر باعتبارها Any?، لكن لا يمكنك إضافة عناصر لأن النوع الفعلي غير معروف.
fun main() {
val unknown: List<*> = listOf("x", "y")
val first: Any? = unknown.first()
println(first)
}اختيار الإسقاط
استخدم out T عندما تكون الدالة مخصصة للقراءة فقط، وin T عندما تكون مخصصة للكتابة فقط، و* عندما لا يكون النوع الدقيق مهمًا. تجعل هذه الإسقاطات الفئات غير المتباينة قابلةً للاستخدام بطرق مرنة وآمنة نوعيًا.
العلاقة مع أحرف البدل في Java
تقابل إسقاطات Kotlin، out T وin T، أحرف البدل في Java، ? extends T و? super T. إذا كنت تعرف الأنواع العامة في Java، فستبدو لك الإسقاطات مألوفة.
تحقق سريع
ما الذي يمكنك فعله باستخدام مصفوفة نوعها Array<out Any>؟
مراجعة
يطبّق تباين موضع الاستخدام إسقاطات out للقراءة فقط أو in للكتابة فقط في استخدام محدد، ويستخدم * إسقاطًا نجميًا عندما يكون النوع غير معروف. يتيح ذلك استخدام الفئات غير المتباينة بمرونة من دون تغيير تعريفها. ستتعلم بعد ذلك كيفية تقييد وسائط الأنواع باستخدام القيود العامة.
تعلم Kotlin مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 51
- الدروس
- 203
الأسئلة الشائعة
هل درس «التباين في موضع الاستخدام» مجاني؟
نعم — نص درس «التباين في موضع الاستخدام» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Kotlin Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Kotlin Academy 4 دروس في المجموع.
ماذا ستتعلم في «التباين في موضع الاستخدام»؟
إسقاطات الأنواع تتمرن على Kotlin Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Kotlin Academy؟
لا تُشترط خبرة سابقة. Kotlin Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «التباين في موضع الاستخدام»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Kotlin Academy هذا؟
نعم. كل درس في Kotlin Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الدوال والفئات العامة
- التباين في موضع التصريح
- التباين في موضع الاستخدام
- قيود الأنواع العامة