Kotlin 运算符重载

在本文中,您将通过示例学习有关运算符重载的内容(定义运算符如何为用户定义的类型(如对象)工作)。

在Kotlin中使用operator时,将调用它的相应成员函数。 例如,表达式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)
}

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

2、与Scala之类的语言不同,Kotlin中只能重载一组特定的运算符。