kotlin扩展函数

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 层面上是
多态支持 不支持(不能被子类重写)

相关推荐
小羊没烦恼!4 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
千里马学框架4 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台4 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone4 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
伞伞悦读4 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
致远ccc4 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
C语言小火车4 天前
C/C++ 为什么需要编译器?
开发语言·c++
霍霍的袁4 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
ttyyttemo4 天前
Kotlin 协程中的 Job 结构化并发与取消
android
孙启超4 天前
【AI开发之Rust】第 11 课:智能指针与内部可变性
开发语言·后端·rust