Kotlin提供了相似于C语言中typedef的功能:能够为已有的类型指定另外一个可读性更强的名字。Kotlin提供了typealias来定义类型别名。typealias语句的语法格式为:html
typealias 类型别名 = 已有类型java
若是类型名太长,咱们可使用较短的新名称替代原类型名。它有助于缩短较长的泛型类型。 例如,一般缩减集合类型是颇有吸引力的。编程
// 为Set<Network.Node>指定更短的别名NodeSetapp
typealias NodeSet = Set<Network.Node>dom
// 为MutableMap<K, MutableList<File>>指定更短的别名:FileTable<K>ide
typealias FileTable<K> = MutableMap<K, MutableList<File>>函数
接下来便可直接使用NodeSet、FileTable<K>命名变量。post
var set: NodeSetcode
var table: FileTable<String>orm
不少时候,咱们也可能够经过别名为内部类起一个更短的别名。例如以下程序。
程序清单: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))