二元运算符

表达式 转换
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。

results matching ""

    No results matching ""