在Kotlin中使用运算符时,将调用它的相应成员 函数 。例如,表达式a+b
在a.plus(b)
转换为a.plus(b)
。
fun main(args: Array) {
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) {
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)
转换为p1.plus(p2)
。
示例:-运算符重载
在这个例子中,你将学会过载--
运算符。表达--a
转化为a.dec()
引擎盖下。
dec()
成员 函数不带任何参数。
fun main(args: Array) {
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) {
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中重载的运算符及其相应的成员函数。