Kotlin-2.5-扩展

本文介绍了Kotlin中的扩展功能,包括扩展函数和属性的概念,如何在实际项目中使用这些功能,以及扩展的一些高级特性如可为空的接收者、成员函数与扩展函数的冲突解决等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题汇总:

1、什么是扩展?

Kotlin提供一种给类增加新功能的能力,却不需要继承或者采用设计模式(装饰者模式)。Kotlin支持扩展函数extension functions和扩展属性extension properties

2、简单扩展实例:

MutableList是接收者,swap是函数扩展。

fun MutableList<Int>.swap(index1: Int, index2: Int) {
    val tmp = this[index1] // 'this'对应List
    this[index1] = this[index2]
    this[index2] = tmp
}
val l = mutableListOf(1, 2, 3)
l.swap(0, 2) //给MutableList扩展了`swap`功能

3、扩展是静态完成的,类型是由调用的函数静态决定的

open class C

class D: C()

fun C.foo() = "c"

fun D.foo() = "d"

fun printFoo(c: C) { 
    println(c.foo()) //决定了参数类型是C,会调用C.foo()
}

printFoo(D()) //会调用C.foo()

4、类的成员函数名与类的扩展函数冲突:

  1. 成员函数名与扩展函数名相同,使用时会调用成员函数。
  2. 可以使用不同参数进行函数重载,就可以通过不同参数调用两种函数。

5、“可为空”的接收者

扩展的接收者可以为空,但是需要确定是否为空。下面的toString()扩展就解释了为何toString()不需要判断空

fun Any?.toString(): String {
    if (this == null) return "null"
    // 非空判断后,下面会进行转换,转换为String
    // ...
    return toString()
}

6、扩展属性的特点:

  1. 扩展属性并不是真的在类中插入成员,因此没有有效的方法使得扩展属性拥有backing field
  2. 因此扩展属性不允许有扩展属性。
  3. 扩展属性的行为只能通过显式的getter和setter定义

7、可以扩展同伴对象的属性和函数。

同伴对象扩展和一般的同伴对象成员一样,可以直接通过ClassName.fun()来调用

8、扩展范围

  1. 一般是直接在最顶层(直接在包下面)定义扩展
  2. 在声明包之外使用扩展,需要import该包或者具体的扩展。

9、将扩展作为成员

声明扩展的类的实例称为调度接收方,扩展方法的接收方类型的实例称为扩展接收方。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值