简介
运算符重载是 Kotlin 中的提供的一个比较有趣的语法糖,我们知道,在 Java 中有许多语言内置的运算符关键字,比如 + - * / % ++ – 。而 Kotlin 中允许我们将这些所有的运算符甚至其他的关键字进行重载
在 Java 中的运算符基本都是加减乘除那样的,相信每个人肯定都用过。但是在 Kotlin 中的运算符重载允许我们让任意两个对象相加,或者是进行其他更多的功能
运算符重载
假如有这么一个例子,在 Kotlin 中运算法重载使用的关键字是使用 operator 修饰,只要在指定函数的前面加上 operator 关键字,就可以实现运算符重载的功能了。但是问题在于这个指定函数是什么呢? 这是运算符重载里面比较复杂的一个问题,因为不同的运算符对应的重载函数是不同的。比如说加号的运算符是 plus() ,减号的运算符是 minus() ,各自所对应的运算符重载函数名称都不是相同的
这里我们尝试两个钱的对象相加,返回两个对象钱的数量之和。如下代码可以看到这里使用的是 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) } }
使用
|
|
使用方式就像上面那样了。可以和对象相加,也可以和数字相加。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) |