Kotlin 通过
operator
关键字 修饰 操作符函数,来实现 操作符重载。
++
操作,对应inc
函数,--
操作符,对应dec
函数
举例,Point
类 实现 ++
操作符重载:
class Point {
operator fun inc(): Point {
// 实现 ++ 重载
return Point(x+1, y+1)
}
}
说明:对象 遇到 操作符时,即调用 对应的 操作符函数。
操作符函数 根据 操作符 分类:
操作符 | 重载函数名 |
---|---|
a++ | a.inc() |
a– | a.dec() |
!a | a.not() |
+a | a.unaryPlus() |
-a | a.unaryMinus() |
操作符 | 重载函数名 |
---|---|
a+b | a.plus(b) |
a-b | a.mius(b) |
a*b | a.times(b) |
a / b | a.div(b) |
a…b | a.rangeTo(b) |
a…<b | a.rangeUtil(b) |
操作符 | 重载函数名 |
---|---|
a == b | a?.equals(b) ?: (b === null) |
a != b | !(a?.equals(b) ?: (b === null)),即 相等的 取反 |
实现了
Comparable
接口的compareTo
方法,通过 其返回值比较。
操作符 | 重载函数名 |
---|---|
a > b | a.compareTo(b) > 0 |
a < b | a.compareTo(b) < 0 |
a >= b | a.compareTo(b) >= 0 |
a <= b | a.compareTo(b) <= 0 |
操作符 | 重载函数名 |
---|---|
a in b | a.contains(b) |
a !in b | !a.contains(b) |
操作符 | 重载函数名 |
---|---|
a[i] | a.get(i) |
a[i] = b | a.set(i, b) |
Kotlin 实现 可调用函数,基于
kotlin.jvm.functions.Function1 - 22...N
1 - 22 对应是 形参的个数,N 时 用 vararg 可变参数
实现了 invoke
操作符重载方法。
operator fun invoke(p1: P1): R
操作符 | 重载函数名 |
---|---|
a() | a.invoke() |
a(i) | a.invoke(i) |
在 属性委托 中,实现了
getValue
和setValue
方法,实现 委托属性的 读写。
方法 添加了operator
修饰,即 委托操作符的重载。
data class Point(var x: Int = 0, var y: Int = 0) {
operator fun inc(): Point {
return Point(this.x + 1, this.y + 1);
}
operator fun dec(): Point {
return Point(this.x - 1, this.y - 1);
}
}
fun main(args: Array<String>) {
var pt = Point(0, 0)
pt++
pt--
pt--
println("pt: $pt")
}
// 输出结果
pt: Point(x=-1, y=-1)