每天学一点 Kotlin -- 对象进阶:类型别名

2021-12-08  本文已影响0人  冯可乐同学

----《第一季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()
}
相关代码:https://gitee.com/fzq.com/test-demo
上一篇下一篇

猜你喜欢

热点阅读