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