📜  Kotlin运算符重载

📅  最后修改于: 2020-10-05 14:55:57             🧑  作者: Mango

在本文中,您将通过示例了解有关运算符重载的信息(定义运算符如何处理诸如对象之类的用户定义类型)。

在Kotlin中使用运算符时,将调用它的相应成员 函数 。例如,表达式a+ba.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 + p2p1.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中重载的运算符及其相应的成员函数。