Kotlin 允许通过运算符重载(Operator Overloading)来为自定义类型定义运算符的行为。通过运算符重载,你可以让自定义类的对象支持像+、-、*、/等运算符操作,从而使代码更加简洁和直观。
什么是运算符重载?
运算符重载是指为自定义类定义运算符的行为。例如,你可以让两个自定义对象使用 + 运算符相加,或者使用 == 运算符比较是否相等。
Kotlin 通过预定义的函数名来实现运算符重载。每个运算符都对应一个固定的函数名,你只需要在类中实现这些函数即可。
语法糖表达式和实际调用函数对照表
### 语法
### 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)来为已有的类添加运算符重载。这样即使我们无法修改某个类(如 String 或 List),也可以扩展其功能。
示例 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