Kotlin 操作符重载

Kotlin 的‌操作符重载 ‌机制允许开发者通过预定义函数名和 operator 修饰符,为自定义类型赋予与内置类型相似的操作符行为。以下是核心要点和示例:


一、操作符重载的实现方式

  1. 成员函数重载

    在类内部声明特定名称的成员函数并标记 operator

    kotlin 复制代码
    data class Point(val x: Int, val y: Int) {
        operator fun plus(other: Point) = Point(x + other.x, y + other.y)  // + 操作符 ‌:ml-citation{ref="2,4" data="citationList"}
    }
    val p1 = Point(1, 2)
    val p2 = Point(3, 4)
    println(p1 + p2)  // 输出: Point(x=4, y=6)
  2. 扩展函数重载

    为现有类添加操作符行为(无需修改原类):

    kotlin 复制代码
    operator fun Point.minus(other: Point) = Point(x - other.x, y - other.y)  // - 操作符 ‌:ml-citation{ref="4,7" data="citationList"}
    println(p2 - p1)  // 输出: Point(x=2, y=2)

二、常见操作符与对应函数

操作符类型 操作符示例 对应函数名 说明
算术操作符 +, -, * plus, minus, times 优先级遵循数学规则(如 * 优先于 +)‌34
比较操作符 ==, >, < equals, compareTo == 调用 equals>< 依赖 compareTo ‌68
索引操作符 [], []= get, set 允许类似数组的访问和修改 ‌34
调用操作符 () invoke 使对象可像函数一样调用 ‌37
一元操作符 +a, -a, ! unaryPlus, unaryMinus, not 作用于单操作数 ‌16

三、示例与应用场景

1. 自定义向量运算

kotlin 复制代码
data class Vector(val x: Int, val y: Int) {
    operator fun times(scalar: Int) = Vector(x * scalar, y * scalar)  // * 操作符 ‌:ml-citation{ref="2,4" data="citationList"}
}
val v = Vector(2, 3)
println(v * 5)  // 输出: Vector(x=10, y=15)

2. 集合扩展操作

kotlin 复制代码
operator fun List<Int>.get(indexes: IntRange): List<Int> {  // 重载 [] 支持范围索引 ‌:ml-citation{ref="3,7" data="citationList"}
    return this.slice(indexes)
}
val list = listOf(1, 2, 3, 4, 5)
println(list[1..3])  // 输出: [2, 3, 4]

3. 自定义比较逻辑

kotlin 复制代码
class Student(val score: Int) {
    operator fun compareTo(other: Student) = score.compareTo(other.score)  // > 和 < 操作符 ‌:ml-citation{ref="6,8" data="citationList"}
}
val s1 = Student(85)
val s2 = Student(90)
println(s1 < s2)  // 输出: true

四、注意事项

  1. 函数签名必须匹配
    操作符函数的参数和返回类型需严格符合约定(如 plus 需返回新对象)‌14。
  2. 避免滥用
    过度重载可能降低代码可读性(如用 + 表示非加法操作)‌26。
  3. 不可修改原对象
    一元操作符(如 inc())应返回新实例,而非修改原对象 ‌68。

五、与 Java 的对比

特性 Kotlin 操作符重载 Java 实现方式
语法简洁性 通过 operator 关键字直接支持 需手动实现特定方法(如 add 方法)
扩展性 支持扩展函数重载 仅能通过类内部方法重载
操作符范围 覆盖更广(如 invoke 有限支持(如 + 仅限字符串拼接)

通过合理使用操作符重载,可显著提升代码表达力,但需遵循语义明确的原则

相关推荐
技术liul10 小时前
使用安卓平板,通过USB数据线(而不是Wi-Fi)来控制电脑(版本1)
android·stm32·电脑
_祝你今天愉快12 小时前
Android FrameWork - 开机启动 & Init 进程 初探
android
2501_9160074712 小时前
iOS App 上架实战 从内测到应用商店发布的全周期流程解析
android·ios·小程序·https·uni-app·iphone·webview
TimeFine12 小时前
Android 邮件发送日志
android
杨过过儿12 小时前
【Task02】:四步构建简单rag(第一章3节)
android·java·数据库
Wgllss13 小时前
Kotlin 享元设计模式详解 和对象池及在内存优化中的几种案例和应用场景
android·架构·android jetpack
zzywxc78715 小时前
AI 行业应用:金融、医疗、教育、制造业领域的落地案例与技术实现
android·前端·人工智能·chrome·金融·rxjava
sTone8737515 小时前
android studio之外使用NDK编译生成android指定架构的动态库
android·c++
胖虎116 小时前
Android 入门到实战(三):ViewPager及ViewPager2多页面布局
android·viewpager·viewpager2
风往哪边走18 小时前
Media3在线本地视频播放器
android