التسمية البديلة للأنواع (Type aliases) في لغة Kotlin

من موسوعة حسوب
اذهب إلى: تصفح، ابحث
تدعم لغة Kotlin ميّزة التسمية البديلة للأنواع الموجودة للبيانات، وخاصّة إن كان اسم النوع طويلًا فيُستعاض عنه باسمٍ أقصرٍ ويُستخدَم الاسم الجديد في كتابة الشيفرات؛ فمن المفيد مثلًا تسمية الأنواع المُعمّمة (generics) بأسماء أقصرٍ، مثل الشيفرة الآتية المُستخدَمة لتسمية أنواع المجموعات (collections):
typealias NodeSet = Set<Network.Node>

typealias FileTable<K> = MutableMap<K, MutableList<File>>
وبالإمكان أيضًا تسمية الأنواع المختلفة للدوال، مثل:
typealias MyHandler = (Int, String, Any) -> Unit

typealias Predicate<T> = (T) -> Boolean
وكذلك الأمر بالنسبة للأصناف الداخليّة (inner classes) والمتداخلة (nested classes)، مثل:
class A {
    inner class Inner
}
class B {
    inner class Inner
}

typealias AInner = A.Inner
typealias BInner = B.Inner
إذ لا تٌنشِئ التسمية نوعًا جديدًا بل هي مُجرَّد تسميةٍ لنفس النوع ضمنيًا، فعند كتابة العبارة typealias Predicate<T>‎ مثلًا واستخدام Predicate<Int>‎ في الشيفرة فإن المُترجِم يُوسِّعها إلى الصيغة ‎(Int) -> Boolean وأصبح ممكنًا بذلك تمريرُ متغيِّرٍ من النوع الذي خصَّصتَه بنفسك حيثما يُستخدَم النوع الأصليّ للدالة والعكس صحيح، مثل:
typealias Predicate<T> = (T) -> Boolean

fun foo(p: Predicate<Int>) = p(42)

fun main(args: Array<String>) {
    val f: (Int) -> Boolean = { it > 0 }
    println(foo(f)) // "true" ستظهر

    val p: Predicate<Int> = { it > 0 }
    println(listOf(1, -2).filter(p)) //  "[1]" ستظهر
}

مصادر