----《第一季Kotlin崛起:次世代Android开发 》学习笔记
总目录:每天学一点 Kotlin ---- 目录
上一篇:每天学一点 Kotlin -- 对象进阶:this 表达式
下一篇:每天学一点 Kotlin -- 对象进阶:操作符重载
1. 类型别名
1.1 类型别名:使用关键字 typealias 进行定义,具体格式如下:
typealias 别名 = 类名
1.2 类型设定别名和变量赋值看起来很像,只是变量赋值用到的声明是关键字 val/var ,而类型别名是用 typealias。举个栗子:
class TestTypealiasClass(name: String, age: Int) {
var name = name
var age = age
}
typealias MyTypealias = TestTypealiasClass
fun testTypealias1() {
var t1 = TestTypealiasClass("t1", 10)
var t2 = MyTypealias("t2", 10)
println("name = ${t1.name}, age = ${t1.age}")
println("name = ${t2.name}, age = ${t2.age}")
}
fun main() {
testTypealias1()
}
打印结果:
name = t1, age = 10
name = t2, age = 10
2. 使用范围
2.1 可以进行类型别名的有:类名,泛型类,函数类型,泛型函数,内部类。
2.2 举个栗子:
2.2.1 对泛型类进行类型别名:
(1) 在未使用类型别名前
class MyType<U, T>(a: U, b: T) {
val a: U = a
val b: T = b
}
fun testTypealias2() {
val t: MyType<String, Int> = MyType("shen", 20)
val m: MyType<String, Int> = MyType("zhou", 22)
val n: MyType<String, Int> = MyType("wang", 15)
}
(2) 使用类型别名后
typealias UType = MyType<String, Int>
fun testTypealias2_1() {
val t: UType = MyType("shen", 20)
val m: UType = MyType("shen", 20)
val n: UType = MyType("shen", 20)
}
(3) 对使用类型别名进行优化扩展
typealias UType1<U> = MyType<U, Int>
fun testTypealias2_2() {
val t: UType1<String> = MyType("shen", 20)
val m: UType1<Int> = MyType(12, 20)
val n: UType1<Double> = MyType(13.13, 20)
}
2.2.2 对函数类型进行别名 -- 注意:是函数类型,不是函数名称
fun testTypealiasOperate(function: (Int, Int) -> Unit, a: Int, b: Int) {
function(a, b)
}
上面是一个非常简单的函数,但是如果在很多情况下需要用到( Int, Int) - > Unit
这个类型,那就很冗余了 ,修改代码如下:
typealias myFun = (Int, Int) -> Unit
fun testTypealiasOperate2(function: myFun, a: Int, b: Int) {
function(a, b)
}
也可以对好像函数进行别名
typealias myFun2<T, U> = (T, U) -> Unit
fun <T, U> testTypealiasOperate23(function: myFun2<T, U>, a: T, b: U) {
function(a, b)
}
2.2.3 对类里面的方法或全局函数名称进行别名
方法或函数名称不可别名,因为函数名称不能作为类型使用。为什么能对类的名称进行别名 ,那是因为类的名称本身就代表着一种类型,而函数的名称和类里面的方法都没有代表类型,因此是不可以的。在这里需要区分函数类型和函数名称,它们是不同的概念。
2.2.4 对内部类进行别名
class TypealiasPerson {
inner class TypealiasPersonStudent {}
}
typealias InStudent = TypealiasPerson.TypealiasPersonStudent
fun testTypealiasOperate3() {
val p = TypealiasPerson()
val s1: TypealiasPerson.TypealiasPersonStudent = p.TypealiasPersonStudent()
val s2: InStudent = p.TypealiasPersonStudent()
}
网友评论