Kotlin提供了类似于C语言中typedef的功能:可以为已有的类型指定另一个可读性更强的名字。Kotlin提供了typealias来定义类型别名。typealias语句的语法格式为:
typealias 类型别名 = 已有类型
如果类型名太长,我们可以使用较短的新名称替代原类型名。它有助于缩短较长的泛型类型。 例如,通常缩减集合类型是很有吸引力的。
// 为Set<Network.Node>指定更短的别名NodeSet
typealias NodeSet = Set<Network.Node>
// 为MutableMap<K, MutableList<File>>指定更短的别名:FileTable<K>
typealias FileTable<K> = MutableMap<K, MutableList<File>>
接下来即可直接使用NodeSet、FileTable<K>命名变量。
var set: NodeSet
var table: FileTable<String>
很多时候,我们也可可以通过别名为内部类起一个更短的别名。例如如下程序。
程序清单:codes\02\2.10\AliasTest.kt
class A {
inner class Inner
}
class B {
inner class Inner
}
// 为A.Inner内部类指定别名
typealias AInner = A.Inner
// 为A.Inner内部类指定别名
typealias BInner = B.Inner
fun main(args: Array<String>) {
// 使用AInner定义变量、调用对象
var a: AInner = A().AInner()
// 使用BInner定义变量、调用对象
var b = B().BInner()
}
上面粗体字代码为A.Inner、B.Inner两个内部类分别指定了别名:AInner、BInner,接下来程序中即可使用AInner、BInner别名类定义变量、创建对象。
此外,Kotlin自己也大量利用了别名这个功能,Kotlin利用别名建立Kotlin类和Java类之间的关系。如下代码是Kotlin集合体系中定义的别名。
typealias kotlin.ArrayList<E> = java.util.ArrayList<E>
typealias kotlin.HashMap<K, V> = java.util.HashMap<K, V>
typealias kotlin.HashSet<E> = java.util.HashSet<E>
typealias kotlin.LinkedHashMap<K, V> = java.util.LinkedHashMap<K, V>
typealias kotlin.LinkedHashSet<E> = java.util.LinkedHashSet<E>
typealias kotlin.RandomAccess = java.util.RandomAccess
与Java相比,Kotlin的Lambda表达式是一个差别较大的特色功能:Java的Lambda表达式的类型是函数式接口,而Kotlin的Lambda表达式的类型直接就是函数类型,因此Kotlin也允许Lambda表达式的类型指定别名。例如如下代码。
程序清单:codes\02\2.10\AliasTest.kt
// 为(T) -> Boolean类型指定别名Predicate<T>
typealias Predicate<T> = (T) -> Boolean
// 使用Predicate<String>定义变量,该变量的值是一个Lambda表达式
val p: Predicate<String> = { it.length > 4 }
// 为filter()方法传入p参数,只保留长度大于4的字符串
println(arrayOf("Java", "Objective-C", "Go", "Kotlin").filter(p))