原文: https://www.programiz.com/kotlin-programming/operator-overloading
在本文中,您将通过示例学习有关运算符重载(定义运算符如何处理用户定义的类型(如对象)的方法)。
在 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 for basic types
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
// for string concatenation
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) {
// overloading plus function
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) {
// overloading plus function
operator fun plus(p: Point) = Point(x - p.x, y - p.y)
}
尽管上面的程序在技术上是正确的,但我们使用+
运算符减去了两个对象的相应属性,这使程序变得混乱。
2.与 Scala 之类的语言不同,Kotlin 中只能重载特定的运算符集。 访问页面以了解可在 Kotlin 中重载的运算符及其相应的成员函数。