التسمية البديلة للأنواع (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]" ستظهر
}

مصادر