一、概念
就是另外取个名称,解决又臭又长的命名。可用于:类、泛型类、内部类、函数类型、泛型函数。格式:typealias 别名 = 原类型名,需要声明在顶层。
自 Kotlin v2.3,可以声明在类、接口、对象中,默认 private 限制在内部使用(可显式声明为 internal、public 使其能在外部被访问),作用域隔离避免顶层命名污染,因此可将基本数据类型改成更有意义的名称,如 private typealias BookName = String。
Kotlin
//之前:又臭又长
class YouChouYouChang{ fun show() = println("Hello") }
val ycyc = YouChouYouChang()
ycyc.show() //打印:Hello
//现在:取别名
typealias NewName = YouChouYouChang
val nn = NewName()
nn.show() //打印:Hello
//类型强转无必要
println(nn is YouChouYouChang) //打印:true
println(nn is NewName) //打印:true
二、使用
2.1 基本使用
3.1.1 泛型类
Kotlin
class Old<T, R>(param1: T, param2: R)
typealias New1 = Old<Int, String>
typealias New2<T> = Old<T, String>
val a = New1(3, "")
val b = New2("", "")
3.1.2 内部类
Kotlin
class Outter {
inner class Inner {}
}
typealias AA = Outter.Inner
val in1 = out.Inner()
val in2 = out.AA()
3.1.3 函数类型
Kotlin
fun old(function: (Int, String) -> Unit, num: Int, name: String) {}
typealias new = (Int, String) -> Unit
fun new(function: new, num: Int, name: String) {}
3.1.4 泛型函数
Kotlin
typealias new2<T, R> = (T, R) -> Unit
fun <T, R> new2(function: new2<T, R>, param1: T, param2: R) {}
2.2 嵌套类型别名(Nested Type Aliases)
kotlin v2.3.0 支持。
Kotlin
typealias UserId = String
typealias ProductId = String
typealias UserProducts = Map<UserId, List<ProductId>>
typealias UserProductsCallback = (UserProducts) -> String
fun getUserProducts(callback: UserProductsCallback) {
val products = mapOf(
"张三" to listOf("车", "房"),
"李四" to listOf("电视", "手机")
)
callback(products)
}