跳到主要内容

Kotlin 运算符重载

提示
  1. 运算符重载原理:在 Kotlin 中,使用运算符其实是调用了相应的成员函数。例如,a + b 实际上是 a.plus(b) 的调用。这种机制允许对基本类型和字符串类型的 plus() 函数进行重载。
  2. 自定义对象的运算符重载:可以通过重载相应的成员函数来定义对象对运算符的响应方式。例如,通过重载 plus() 函数,可以定义对象对 + 运算符的响应。
  3. 注意事项:重载运算符时,应保持运算符的原始含义,避免产生混淆。同时,Kotlin 限制了可以重载的运算符种类,只允许重载一组特定的运算符。

当你在 Kotlin 中使用运算符时,实际上调用的是相应的成员函数。例如,表达式 a+b 在底层转换为 a.plus(b)

fun main(args: Array<String>) {
val a = 5
val b = 10

print(a.plus(b)) // print(a+b)
}

当你运行程序时,输出将是:

15

事实上,plus() 函数被重载,以便与各种 Kotlin 基本类型和 String 类型一起工作。

// 基本类型的 + 运算符
operator fun plus(other: Byte): Int
operator fun plus(other: Short): Int
operator fun plus(other: Int): Int
operator fun plus(other: Long): Long
operator fun plus(other: Float): Float
operator fun plus(other: Double): Double

// 用于字符串连接
operator fun String?.plus(other: Any?): String

你也可以通过重载相应的函数来定义运算符对对象的作用方式。例如,你需要通过重载 plus() 函数来定义对象的 + 运算符的工作方式。

示例:重载 + 运算符

fun main(args: Array<String>) {
val p1 = Point(3, -8)
val p2 = Point(2, 9)

var sum = Point()
sum = p1 + p2

println("sum = (${sum.x}, ${sum.y})")
}

class Point(val x: Int = 0, val y: Int = 10) {

// 重载 plus 函数
operator fun plus(p: Point) : Point {
return Point(x + p.x, y + p.y)
}
}

当你运行程序时,输出将是:

sum = (5, 1)

这里,plus() 函数用 operator 关键字标记,告诉编译器正在重载 + 运算符。

表达式 p1 + p2 在底层转换为 p1.plus(p2)

示例:重载 -- 运算符

在这个示例中,你将学习如何重载 -- 运算符。表达式 --a 在底层转换为 a.dec()

dec() 成员函数不接受任何参数。

fun main(args: Array<String>) {
var point = Point(3, -8)
--point

println("point = (${point.x}, ${point.y})")
}

class Point(var x: Int = 0, var y: Int = 10) {
operator fun dec() = Point(--x, --y)
}

当你运行程序时,输出将是:

point = (2, -9)

记住,

operator fun dec() = Point(--x, --y)

等同于

operator fun dec(): Point {
return Point(--x, --y)
}

几个重要提示

  1. 当你重载运算符时,应该尽量保持运算符的原始含义。例如,
fun main(args: Array<String>) {
val p1 = Point(3, -8)
val p2 = Point(2, 9)

var sum = Point()
sum = p1 + p2

println("sum = (${sum.x}, ${sum.y})")
}

class Point(val x: Int = 0, val y: Int = 10) {

// 重载 plus 函数
operator fun plus(p: Point) = Point(x - p.x, y - p.y)
}

虽然上面的程序在技术上是正确的,但我们使用了 + 运算符来减去两个对象的对应属性,这使得程序变得令人困惑。

  1. 与 Scala 等语言不同,Kotlin 只允许重载一组特定的运算符。访问该页面以了解可以在 Kotlin 中重载的运算符及其相应的成员函数。