Kotlin 允许通过运算符重载(Operator Overloading)来为自定义类型定义运算符的行为。通过运算符重载,你可以让自定义类的对象支持像+-*/等运算符操作,从而使代码更加简洁和直观。

什么是运算符重载?

运算符重载是指为自定义类定义运算符的行为。例如,你可以让两个自定义对象使用 + 运算符相加,或者使用 == 运算符比较是否相等。

Kotlin 通过预定义的函数名来实现运算符重载。每个运算符都对应一个固定的函数名,你只需要在类中实现这些函数即可。

语法糖表达式和实际调用函数对照表

1742788766384-456a3add-b56a-4591-9518-a5dfc9de87ba.png ### 语法 ### 3.1 `+`重载 在 Kotlin 中,运算符重载是通过 **定义带有 ****operator**** 关键字的函数** 来实现的。例如: ```plain class Point(val x: Int, val y: Int) { operator fun plus(other: Point): Point { return Point(x + other.x, y + other.y) } }

fun main() {
val p1 = Point(2, 3)
val p2 = Point(4, 5)
val result = p1 + p2 // 等价于 p1.plus(p2)
println(“Result: ({result.x}, {result.y})”) // 输出:Result: (6, 8)
}

* 通过 `operator fun plus()` 方法重载了 `+` 运算符。
* 这样 `p1 + p2` 语法就等价于 `p1.plus(p2)` 了。
### 3.2 多重运算符重载
有时会觉得单纯的对象想加不够方便,如果对象相加的同时还能够和数字相加,就更好了。比如下面。
```plain
/**
 * @author zhangzhen40
 * @version
 * @since 2025/03/14
 */
class Money(private val value: Int) {

    operator fun plus(money: Money): Money {
        val sum = value + money.value
        return Money(sum)
    }

    /**
     * 多重重载,接收一个整数型数字。
     * 现在 Money 对象拥有了和 Int 相加的能力。
     * 
     * @param newValue Int
     * @return Money
     */
    operator fun plus(newValue: Int): Money {
        val sum = value + newValue
        return Money(sum)
    }
}

3.3 运算符重载 + 扩展函数

Kotlin 允许使用 扩展函数(Extension Functions)来为已有的类添加运算符重载。这样即使我们无法修改某个类(如 StringList),也可以扩展其功能。

示例 1:扩展 String 进行重复拼接

/**
 * 对 String 进行扩展并进行运算符重载
 * @receiver String
 * @param n Int
 * @return String
 */
operator fun String.times(n: Int): String = this.repeat(n)
 
fun main() {
    println("hello".times(3))
}

示例 2:扩展 List 进行合并

operator fun <T> List<T>.plus(other: List<T>): List<T> {
 
    val arrayList = ArrayList<T>()
 
    for (num in this) {
        arrayList.add(num)
    }
 
    for (num in other) {
        arrayList.add(num)
    }
 
    return arrayList
}
 
fun main() {
    val list1 = listOf(1, 2, 3)
    val list2 = listOf(4, 5, 6)
    println(list1 + list2)
}

更新: 2025-03-24 11:59:37
原文: https://www.yuque.com/dongpozhouzi-mshe3/zhm85g/ie2vqrca5okwd39b


相关笔记