Kotlin背书系列-类型别名

Kotlin背书系列-类型别名

Kotlin 提供了类似与C语言的 typedef 功能: 可以为已有的类型指定另一个可读性更强的名字。 Kotlin 提供了 typealias 来定义类型别名。
typealias 语句的语法格式为:


typealias 类型别名 = 已有类型名

如果类型名太长, 我们可以使用夹断的新名称来替代原类型名。这样有助于缩短较长范型的类型。
例如, 通常缩短集合类型是很有吸引力的。


// 为 Set<Network.Node>  指定更短的别名: NodeSet
typealias NodeSet = Set<Network.Node>
// 为 MutableMap<K, MutableList<Fill>> 指定更短的别名:^_^FileTable<K>
typealias FileTable<K> = MutableNam<K, MutableList<Fill>>

接下来即可直接使用 NodeSet 和 FileTable 命名变量。


var set: NodeSet
var table: FileTable<String>

很多时候, 我们也可以通过定义别名为内部类起一个更短的名字。例如如下程序。


class A {
    inner class Inner
}

class B {
    inner class Inner
}

// 为 A.Inner 内部类指定别名
typealias AInner = A.Inner
// 为 B.Inner 内部类指定别名
typealias BInner = B.Inner

fun main(args: Array<String>) {
    // 使用 AInner 定义变量、调用对象
    var a: AInner = A().AInner()
    // 使用 BInner 定义变量、调用对象
    var b: BInner = B().BInner()
}

上面程序中的 typealias AInner = A.Innertypealias BInner = B.Inner 代码为 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 表达式的类型指定别名。
例如如下代码。


// 为 <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", "Object-c", "Go", "Kotlin").filter(p))