原文:Kotlin学习快速入门(10)—— 重载运算符使用 – Stars-One的杂货小窝

Kotlin中提供了基础的运算符,但是只是针对基础的数据类型,如Int,Double等

如果我们想让两个对象可以相加的功能,这个时候可以使用重载运算符的功能来实现

介绍

首先,先介绍下什么是运算符,如以下代码:

val a = 2val b = 3val result =a + b

这里的+就是运算符,实际上这里的a+b等同a.plus(b)

这里相当于语法糖的意思,实际上+是调用的plus()方法

重载运算符的关键字为operator,具体可重载的运算符如下表所示:

表达式实际调用方法
a * ba.times(b)
a / ba.div(b)
a % ba.mod(b)
a + ba.plus(b)
a – ba.minus(b)
a += ba.plusAssign(b)
a -= ba.minusAssign(b)
a *= ba.timesAssign(b)
a /= ba.divAssign(b)
a %= ba.remAssign(b)
a == ba.equals(b)
a != b!a.equals(b)
a in bb.contains(a)
a !in b!b.contains(a)
a > ba.compareTo(b) > 0
a < ba.compareTo(b) < 0
a >= ba.compareTo(b) >= 0
a <= ba.compareTo(b) <= 0
+aa.unaryPlus()
-aa.unaryMinus()
!aa.not()
++a,a++a.inc()
–a, a–a.dec()
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] = ba.set(i, b)
a[i, j] = ba.set(i, j, b)
a[i_1, …, i_n] = ba.set(i_1, …, i_n, b)

可能罗列的不全,具体参考运算符重载 | Kotlin

下面我们以*为例,重载运算符来实现一个逻辑

在类中重载运算符

我们有个这样的代码

fun main() {    val list = arrayListOf()    repeat(3) {        val student =Teacher("test")        list.add(student)    }}class Teacher(name:String)

上面的代码是循环3次,并创建了Teacher对象,并添加到List中,实际上我们可以重载运算符,对Teacher类改造一下:

class Teacher(name: String) {    operator fun times(n: Int): List {        val list = arrayListOf()        repeat(n){            val temp = copyBean(this)            list.add(temp)        }        return list    }}

然后使用就变为下面:

fun main() {    val student = Teacher("test")    //相当于此代码    //val list= student.times(3)    val list = student * 3}

注意:

实际上,重载运算符相当于重载运算符对应的方法而已

方法的参数类型和返回类型,根据需要定义即可,不一定需要那么死板

使用扩展来重载运算符

上面提高的示例就是在类中进行重载,我们也可以通过扩展来实现给某个类的运算符进行重载

我们还是以上面的Teacher为例

class Teacher(name: String) //扩展给Teacher加上重载运算符operator fun Teacher.times(n: Int): List {    val list = arrayListOf()    repeat(n) {        val temp = copyBean(this)        list.add(temp)    }    return list}

参考

  • 运算符重载 | Kotlin
  • Kotlin核心语法(五):运算符重载以及其它的约定 – SegmentFault 思否

提问之前,请先看提问须知点击右侧图标发起提问或者加入QQ群一起学习TornadoFx学习交流群:1071184701<!––>