操作符重载
一元操作符
表达式 | 对应函数 |
---|---|
+a | a.unaryPlus() |
-a | a.unaryMinus() |
!a | a.not() |
++a, a++ | a.inc() |
–a, a– | a.dec() |
示例:
1 | data class Point(val x: Int, val y: Int) |
二元操作符
表达式 | 对应函数 |
---|---|
a + b | a.plus(b) |
a - b | a.minus(b) |
a * b | a.times(b) |
a / b | a.div(b) |
a % b | a.rem(b)、a.mod(b)(弃用) |
a..b | a.rangeTo(b) |
示例:
1 | data class Point(val x: Int, val y: Int) { |
没有用于位运算的特殊运算符
- shl — 带符号左移
- shr — 带符号右移
- ushr — 无符号右移
- and — 按位与
- or — 按位或
- xor — 按位异或
- inv — 按位取反
示例:
1 | // kotlin |
in操作符
表达式 | 对应函数 |
---|---|
a in b | b.contains(a) |
a !in b | !b.contains(a) |
示例:
1 | data class Rectangle(val upperLeft: Point, val lowerRight: Point) |
下标访问操作符(通过下标来访问元素:get
和 set
)
表达式 | 对应函数 |
---|---|
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) |
示例:
1 | // 一维 |
调用操作符(invoke)
表达式 | 对应函数 |
---|---|
a() | a.invoke() |
a(i) | a.invoke(i) |
a(i, j) | a.invoke(i, j) |
a(i_i, …, i_n) | a.invoke(i_1, …, i_n) |
圆括号转换为调用带有适当数量参数的 invoke
示例:
1 | class Greeter(val greeting: String) { |
可以通过重写invoke
实例工厂模式
1 | object Any { |
复合赋值运算符
表达式 | 对应函数 |
---|---|
a += b | a.plusAssign(b) |
a -= b | a.minusAssign(b) |
a *= b | a.timesAssign(b) |
a /= b | a.divAssign(b) |
a %= b | a.remAssign(b), a.modAssign(b) (弃用) |
示例:
1 | operator fun <T> MutableCollection<T>.plusAssign(element: T) { |
比较运算符(equals)
表达式 | 对应函数 |
---|---|
a == b | a?.equals(b) ?: (b === null) |
a != b | !(a?.equals(b)) ?: (b ===null) |
(等式校验 ==
被转换为equals
函数的调用,以及null
的校验)
注意:===
和 !==
(同一性检查)不可重载,因此不存在对他们的约定。
这个 ==
操作符有些特殊:它被翻译成一个复杂的表达式,用于筛选 null
值。 null == null
总是 true,对于非空的 x
,x == null
总是 false 而不会调用 x.equals()
。
示例:
1 | class Point(val x: Int, val y: Int) { |
比较操作符(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 |
所有的比较都转换为对 compareTo
的调用,这个函数需要返回 Int
值
示例:
1 | class Person(val firstName: String, val lastName: String): Comparable<Person> { |
参考资料: