Kotlin扩展详解

kotlin的扩展详解

扩展函数
class ExtensionTest{ //扩展接收者类
    fun add(a:Int,b:Int)=a+b
}
fun ExtensionTest.substract(a:Int,b:Int)=a-b //扩展函数
fun main(args: Array<String>) {
    val extensionTest=ExtensionTest()
    extensionTest.add(2,5)
    extensionTest.substract(5,0)
}

扩展函数的解析是静态的

  • 扩展本身并不会真正修改目标类,也就是说它并不会在目标类中插入新的属性和方法。
  • 扩展函数的解析是静态分发的,即不支持多态,调用只取决于对象的声明类型。
  • 调用是由对象声明类型所决定的,而不是由对象的实际类型所决定。
open class AA
class BB:AA()
fun AA.a()="a"
fun BB.b()="b"
fun myprint(aa:AA){
    println(aa.a())
}
fun main(args: Array<String>) {
    myprint(AA()) //打印是“a”
    myprint(BB()) //打印还是“a”,,如果是java肯定是“b”,这就是调用只取决于对象的声明类型,不是初始的实际类型。

}

伴生对象扩展函数
class MyProperty
 val MyProperty.name:String
     get()="hello
     
fun main(args: Array<String>) {
    var myProperty=MyProperty()
    println(myProperty.name)
}
扩展的作用域(类似于java的装饰模式)
  • 扩展函数所定义在的类实例叫做分发接收者(dispatch receiver)
  • 扩展函数所扩展的那个类的实例叫做扩展接收者(extension receiver)
  • 当以上两个名字出现冲突时,扩展接收者的优先级最高
class AA{  //扩展接收者类
    fun method(){
        println("AA method")
    }
}
class BB{ //分发接收者
    fun method2(){
    }
    fun AA.hello(){
        method() //扩展的是AA,当然能调用AA类里的方法
        method2() //同一个类中当然能调用同级的方法
    }
    fun word(aa:AA){
        aa.hello() //声明的对象是AA,hello方法是AA的扩展方法,当然能调用
    }
    fun AA.output(){
        println(toString())//调用的是AA类里的tostring方法,因为扩展接收者的优先级最高
        println(this@BB.toString())//调用的是BB类里的tostring方法
    }
    fun test(){
        val aa=AA()
        aa.output() //扩展函数还是要扩展类的实例调用。
    }
}
fun main(args: Array<String>) {
    BB().test()
}

跳转到官方kotlin扩展

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值