二元运算符
表达式 | 转换 |
---|---|
a + b | a.plus(b) |
a - b | a.mins(b) |
a * b | a.times(b) |
a / b | a.div(b) |
a % b | a.rem(b)或a.mod(b)不建议使用 |
a..b | a.rangeTo(b) |
对于表中的操作符,编译器按照转换的那一栏的方式进行处理。
需要注意的是rem操作符是在Kotlin 1.1中引入的。Kotlin 1.0中使用的mod操作符,在1.1版本已经不建议使用了。
表达式 | 转换 |
---|---|
a in b | b.contains(a) |
a !in b | !b.contains(a) |
对于in和!in的处理是类似的,只是参数的顺序是相反的。
表达式 | 转换 |
---|---|
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) |
方括号被转换成调用get和set方法,并传入适当的参数。
表达式 | 转换 |
---|---|
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) |
圆括号被转换成调用invoke方法,并传入适当的参数。
表达式 | 转换 |
---|---|
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) |
对于赋值操作符,比如a += b,编译器按照如下的步骤进行处理:
- 如果转换对应的一栏的函数是可用的,则分以下情况:如果相应的二元函数(比如plus()和plusAssign())都是可用的,那么会报告错误;返回类型必须是Unit,如果不是,那么将报告错误;最后生成a.plusAssign(b)
- 否则,尝试生成a = a + b的代码(包含类型检查:(a + b)的类型必须是a的子类型)
需要注意的是赋值不是Kotlin中的表达式。
表达式 | 转换 |
---|---|
a == b | a?.equals(b) ?: (b === null) |
a != b | !(a?.equals(b) ?: (b === null)) |
需要注意的是===和!==是不能被重载的,所以对它们来说并没有一个约定俗成的版本。
==操作符是很特别的:它被转换成复杂的表达式来筛选空值。null == null总是true,x == null对于任何非null的x总是false,并不会执行x.equals()。
表达式 | 转换 |
---|---|
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。