美文网首页
每天学一点 Kotlin -- 对象进阶:类型别名

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

作者: 冯可乐同学 | 来源:发表于2021-12-08 09:32 被阅读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

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/gsytaltx.html