目录
1. 运算符重载概念
简单来说,就是Kotlin通过调用自己代码中定义特定的函数名的函数(成员函数或者扩展函数),并且用operator修饰符标记,来实现特定的语言结构比如:
// 一个简单的数据类
data class Foo(val x: Int, val y: Int) {
operator fun plus(other: Foo) : Foo = Foo(x + other.x, y + other.y)
}
fun main(args: Array<String>) {
// 使用的时候
val f1 = Foo(10, 20)
val f2 = Foo(30, 40)
// 直接用+运算符代替plus函数,事实上会调用plus函数
println(f1 + f2) // 打印内容为Foo(x=40, y=60)
}
注意,如果Java要调用这一段代码,要像调用函数一样使用。
2. 重载运算符类型
表达式 | 函数名 |
---|---|
a * b | times |
a / b | div |
a % b | rem,mod(弃用) |
a + b | plus |
a - b | minus |
3. 重载复合赋值运算符
表达式 | 函数名 |
---|---|
a += b | timesAssign |
a /= b | divAssign |
a %= b | remAssign |
a += b | plusAssign |
a -= b | minusAssign |
如果在plus和plusAssign两个函数同时被定义且适用,那么编译器就会报错,最好在设计新类的时候保持(可变性)一致,尽量不同时定义plus和plusAssign运算。如Foo类是不可变的,那么只提供plus运算,如果一个类是可变的,如构造器,那么只需提供plusAssign和类似的运算就够了。
4. 重载一元运算符
表达式 | 函数名 |
---|---|
+a | unaryPlus |
-a | unaryMinus |
!a | not |
++a, a++ | inc |
–a, a– | dec |
5. 重载比较运算符念
表达式 | 函数名 |
---|---|
a == b | a?.equals(b) ?: (b === null) |
a != b | !(a?.equals(b) ?: (b === null)) |
a > b | a.compareTo(b) > 0 |
a < b | a.compareTo(b) < 0 |
a >= b | a.compareTo(b) >= 0 |
a <= b | a.compareTo(b) <= 0 |
含有大于小于符号的比较运算符会被转换成compareTo函数,compareTo的返回类型必须为Int。
重载等号运算符
在我们平时使用判断字符串是否与某个字符串相等的时候,会使用equals函数来判断,然而在Kotlin中,我们可以是用==来代替equals函数,!=来代替!equals。
这是重载等号的一般用法:
data class Foo(val x: Int, val y: Int) {
override operator fun equals(other: Any?): Boolean = when {
// 使用恒等运算符来判断两个参数是否同一个对象的引用
other === this -> true
other !is Foo -> false
else -> other.x == x && other.y == y
}
}