Kotlin提供了类似于C语言的typedef
的功能:可以为已有的类型指定另一个可读性更强的名字。Kotlin提供了typealias
来定义类型别名。
typealias语句的语法格式为:
typealias 类型别名 = 已有类型
如果类型名称太长,你可以另外引入较短的名称,并使用新的名称替代原类型名。
// 为Set 指定更短的别名NodeSet
typealias NodeSet = Set<Network.Node>
// 为MutableMap> 指定更短的别名FileTable
typealias FileTable<K> = MutableMap<K, MutableList<File>>
接下来即可直接使用NodeSet 和FileTable 命名变量。
var set : NodeSet
var table : FileTable<String>
typealias MyHandler = (Int, String, Any) -> Unit
typealias Predicate<T> = (T) -> Boolean
class A {
inner class Inner
}
class B {
inner class Inner
}
//为A.Inner内部类知道别名
typealias AInner = A.Inner
//为B.Inner内部类知道别名
typealias BInner = B.Inner
fun typealiasTest(){
// 使用AInner 定义变量、调用对象
var a : AInner = A().AInner()
// 使用BInner 定义变量、调用对象
var b = B().BInner()
}
Kotlin自身大量利用别名这个功能。比如Kotlin利用别名建立了Kotlin类和Java类之间的关系。
如下代码是Kotlin集合体系中定义的别名。
// IntelliJ API Decompiler stub source generated from a class file
// Implementation of methods is not available
package kotlin.collections
@kotlin.SinceKotlin public typealias ArrayList<E> = java.util.ArrayList<E>
@kotlin.SinceKotlin public typealias HashMap<K, V> = java.util.HashMap<K, V>
@kotlin.SinceKotlin public typealias HashSet<E> = java.util.HashSet<E>
@kotlin.SinceKotlin public typealias LinkedHashMap<K, V> = java.util.LinkedHashMap<K, V>
@kotlin.SinceKotlin public typealias LinkedHashSet<E> = java.util.LinkedHashSet<E>
@kotlin.SinceKotlin public typealias RandomAccess = java.util.RandomAccess
与Java相比,Kotlin的Lambda表达式是一个差异性比较大的特色功能:
Java的Lambda表达式的类型是函数式接口,而Kotlin的Lambda表达式的类型之间就是函数类型。
因此Kotlin也允许为Lambda表达式的类型指定别名。如下代码所示:
//为 (T) -> Boolean 类型指定别名 Predicate
typealias Predicate<T> = (T) -> Boolean
fun foo(p: Predicate<Int>) = p(42)
fun main() {
val f: (Int) -> Boolean = { it > 0 }
println(foo(f)) // 输出 "true"
//使用 Predicate 定义变量,该变量的值是一个Lambda表达式
val p: Predicate<Int> = { it > 0 }
// 为filter() 方法传入p参数,只保留大于0的数字
println(listOf(1, -2, 4, 5, 6, 7 ).filter(p)) // 输出 "[1]"
//使用 Predicate 定义变量,该变量的值是一个Lambda表达式
val p2: Predicate<String> = { it.length > 4 }
// 为filter() 方法传入p参数,只保留长度大于4的字符串
println(arrayOf("Java", "Kotlin", "Python", "C", "C++","OuyangPeng").filter(p2))
}
运行结果为:
true
[1, 4, 5, 6, 7]
[Kotlin, Python, OuyangPeng]