原文: https://www.programiz.com/kotlin-programming/operator-overloading

在本文中,您将通过示例学习有关运算符重载(定义运算符如何处理用户定义的类型(如对象)的方法)。

在 Kotlin 中使用运算符时,将调用其相应的成员函数。 例如,表达式a+b在后台转换为a.plus(b)

  1. fun main(args: Array<String>) {
  2. val a = 5
  3. val b = 10
  4. print(a.plus(b)) // print(a+b)
  5. }

运行该程序时,输出为:

  1. 15

实际上,plus()函数已重载以与各种 Kotlin 原始类型和String一起使用。

  1. // + operator for basic types
  2. operator fun plus(other: Byte): Int
  3. operator fun plus(other: Short): Int
  4. operator fun plus(other: Int): Int
  5. operator fun plus(other: Long): Long
  6. operator fun plus(other: Float): Float
  7. operator fun plus(other: Double): Double
  8. // for string concatenation
  9. operator fun String?.plus(other: Any?): String

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

示例:重载+运算符

  1. fun main(args: Array<String>) {
  2. val p1 = Point(3, -8)
  3. val p2 = Point(2, 9)
  4. var sum = Point()
  5. sum = p1 + p2
  6. println("sum = (${sum.x}, ${sum.y})")
  7. }
  8. class Point(val x: Int = 0, val y: Int = 10) {
  9. // overloading plus function
  10. operator fun plus(p: Point) : Point {
  11. return Point(x + p.x, y + p.y)
  12. }
  13. }

运行该程序时,输出为:

  1. sum = (5, 1)

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

表达式p1 + p2在后台被转换为p1.plus(p2)


示例:重载-运算符

在此示例中,您将学习重载--运算符。 表达式--a在引擎盖下转换为a.dec()

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

  1. fun main(args: Array<String>) {
  2. var point = Point(3, -8)
  3. --point
  4. println("point = (${point.x}, ${point.y})")
  5. }
  6. class Point(var x: Int = 0, var y: Int = 10) {
  7. operator fun dec() = Point(--x, --y)
  8. }

运行该程序时,输出将是:

  1. point = (2, -9)

请记住,

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

相当于

  1. operator fun dec(): Point {
  2. return Point(--x, --y)
  3. }

几个要点

1.重载运算符时,应尝试保持运算符的原始精神。 例如,

  1. fun main(args: Array<String>) {
  2. val p1 = Point(3, -8)
  3. val p2 = Point(2, 9)
  4. var sum = Point()
  5. sum = p1 + p2
  6. println("sum = (${sum.x}, ${sum.y})")
  7. }
  8. class Point(val x: Int = 0, val y: Int = 10) {
  9. // overloading plus function
  10. operator fun plus(p: Point) = Point(x - p.x, y - p.y)
  11. }

尽管上面的程序在技术上是正确的,但我们使用+运算符减去了两个对象的相应属性,这使程序变得混乱。

2.与 Scala 之类的语言不同,Kotlin 中只能重载特定的运算符集。 访问页面以了解可在 Kotlin 中重载的运算符及其相应的成员函数。