Kotlin 的扩展函数(extension function)。
kotlin
fun MutableList<Int>.swap(index1: Int, index2: Int) {
val tmp = this[index1]
this[index1] = this[index2]
this[index2] = tmp
}
🔧 功能解释
这段扩展函数的作用是:给 MutableList<Int>
添加一个名为 swap
的函数,用于交换列表中两个索引处的元素。
fun MutableList<Int>.swap(...)
:- 表示这个
swap
函数被"扩展"到了MutableList<Int>
类型上; - 使用时可以像调用成员函数一样写:
list.swap(0, 2)
。
- 表示这个
this
指的就是被调用的列表对象;- 实现逻辑很简单:用一个临时变量交换两个元素的位置。
🧩 什么是扩展函数?
扩展函数是 Kotlin 提供的一种 给已有类添加新函数 的机制,不需要继承该类或者修改它的源码。
它的语法是:
kotlin
fun <接收者类型>.<函数名>(参数列表): 返回类型 {
// this 表示接收者对象
}
使用时就像是这个函数是该类本身的方法一样调用。
⚙️ 扩展函数的原理(编译原理)
扩展函数本质上并不是给类真的添加了方法 ,而是在 编译时被编译为静态方法,接收者对象作为第一个参数传入。
比如你的 swap
函数,会被编译为一个类似 Java 的静态函数:
java
public static void swap(List<Integer> list, int index1, int index2) {
int tmp = list.get(index1);
list.set(index1, list.get(index2));
list.set(index2, tmp);
}
当你在 Kotlin 中写 list.swap(0, 2)
,编译器会自动转换为上述调用。
所以:
⚠️ 扩展函数不会真正修改类的结构,也不会出现在类的字节码里。
🔍 本质是什么?
- 本质上是 语法糖;
- 实际上就是编译器帮你自动把
list.swap()
转换成了Utils.swap(list, 0, 2)
这样的静态调用; - 它们 没有多态特性(即:扩展函数不会被子类覆盖或重写);
- 如果类中已经有一个成员函数同名,则会优先调用成员函数,扩展函数会被"隐藏"。
🤔 扩展函数是 Java 中的静态方法吗?
✅ 在编译结果上 :是的,Kotlin 的扩展函数在 JVM 上编译后就是静态方法(static method),所以它们本质上和 Java 中的工具类静态方法类似。
❌ 在语法和可读性上:Kotlin 提供了更自然的语法,让它们看起来就像类的成员函数,这提升了可读性和可维护性。
✅ 总结
项目 | Kotlin 扩展函数 |
---|---|
定义方式 | fun Type.functionName(...) |
使用方式 | 像成员方法一样:list.swap(...) |
编译原理 | 被编译成静态方法,第一个参数是接收者对象 |
本质 | 语法糖 + 编译器重写调用方式 |
是否是静态方法 | 在 JVM 层面上是 |
多态支持 | 不支持(不能被子类重写) |