简介

运算符重载是 Kotlin 中的提供的一个比较有趣的语法糖,我们知道,在 Java 中有许多语言内置的运算符关键字,比如 + - * / % ++ – 。而 Kotlin 中允许我们将这些所有的运算符甚至其他的关键字进行重载

在 Java 中的运算符基本都是加减乘除那样的,相信每个人肯定都用过。但是在 Kotlin 中的运算符重载允许我们让任意两个对象相加,或者是进行其他更多的功能

运算符重载

  1. 假如有这么一个例子,在 Kotlin 中运算法重载使用的关键字是使用 operator 修饰,只要在指定函数的前面加上 operator 关键字,就可以实现运算符重载的功能了。但是问题在于这个指定函数是什么呢? 这是运算符重载里面比较复杂的一个问题,因为不同的运算符对应的重载函数是不同的。比如说加号的运算符是 plus() ,减号的运算符是 minus() ,各自所对应的运算符重载函数名称都不是相同的

  2. 这里我们尝试两个钱的对象相加,返回两个对象钱的数量之和。如下代码可以看到这里使用的是 operator 关键字修饰了 plus 函数,这是必须的。同时这里不仅可以进行对象的相加,还可以直接和数字进行相加,因为 Kotlin 中是允许对同一个运算符进行多重重载的。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    
    class Money(val money: Int) {
    			// 对象直接直接相加
        operator fun plus(value: Money) : Money {
            val sum = money + value.money
            return Money(sum)
        }  
            
    			// 对象和数字相加
        operator fun plus(value: Int): Money {
            val sum = money + value
            return Money(sum)
        } 
    }

使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
fun main() {
            val money = Money(10)
            val money2 = Money(20)
            val money3 = 40

            val moneySum = money + money2
            val moneySum2 = moneySum + money3
            
            println("moneySum= ${moneySum.money}") // 结果等于 30
            println("moneySum= ${moneySum2.money}") // 结果等于 70
}

使用方式就像上面那样了。可以和对象相加,也可以和数字相加。Kotlin 中的允许重载的运算符还有很多,如果想要对其他运算符进行重载,或者进行其他的操作,只需要修改对应的指定函数即可

常见的操作符

以下对应的运算符来自 https://www.jianshu.com/p/15dc4cef61e0

常见的操作符和对应的方法名:

一元操作符(Unary Operators)

操作符 方法名
+a a.unaryPlus()
-a a.unaryMinus()
!a a.not()
a++ a.inc()

二元操作符( Binary Operators)

操作符 方法名
a + b a.plus(b)
a – b a.minus(b)
a * b a.times(b)
a / b a.div(b)
a % b a.mod(b)
a..b a.rangeTo(b)
a in b b.contains(a)
a !in b !b.contains(a)
a += b a.plusAssign(b)
a -= b a.minusAssign(b)
a *= b a.timesAssign(b)
a /= b a.divAssign(b)
a %= b a.modAssign(b)

数值类型操作符(Array type operators)

操作符 方法名
a[i] a.get(i)
a[i, j] a.get(i, j)
a[i_1, …, i_n] a.get(i_1, …, i_n)
a[i] = b a.set(i, b)
a[i, j] = b a.set(i, j, b)
a[i_1, …, i_n] = b a.set(i_1, …, i_n, b)

等于和不等于操作符(Equals Operation)

操作符 方法名
a == b a?.equals(b) ?: (b === null)
a != b !(a?.equals(b) ?: (b === null))

比较操作符(Comparison operators)

操作符 方法名
a > b a.compareTo(b) > 0
a < b a.compareTo(b) < 0
a >= b a.compareTo(b) >= 0
a <= b a.compareTo(b) <= 0

调用操作符(Invoke operator)

操作符 方法名
a() a.invoke()
a(i) a.invoke(i)
a(i, j) a.invoke(i, j)
a(i_1, …, i_n) a.invoke(i_1, …, i_n)