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))