评论

收藏

[Android] Kotlin学习快速入门(10)—— 重载运算符使用

移动开发 移动开发 发布于:2022-08-15 12:07 | 阅读数:593 | 评论:0

原文:Kotlin学习快速入门(10)—— 重载运算符使用 - Stars-One的杂货小窝
Kotlin中提供了基础的运算符,但是只是针对基础的数据类型,如Int,Double等
如果我们想让两个对象可以相加的功能,这个时候可以使用重载运算符的功能来实现
介绍
首先,先介绍下什么是运算符,如以下代码:
val a = 2
val b = 3
val result =a + b
这里的+就是运算符,实际上这里的a+b等同a.plus(b)
这里相当于语法糖的意思,实际上+是调用的plus()方法
重载运算符的关键字为operator,具体可重载的运算符如下表所示:
|表达式|实际调用方法|
|a * b|a.times(b)|
|a / b|a.div(b)|
|a % b|a.mod(b)|
|a + b|a.plus(b)|
|a - b|a.minus(b)|
|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 == b|a.equals(b)
|a != b|!a.equals(b)|
|a in b|b.contains(a)|
|a !in b|!b.contains(a)|
|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|a.unaryPlus()|
|-a|a.unaryMinus()|
|!a|a.not()|
|++a,a++|a.inc()|
|--a, a--|a.dec()|
|a| a.get(i)|
|a[i, j]| a.get(i, j)|
|a[i_1, ..., i_n]| a.get(i_1, ..., i_n)|
|a = 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)|
可能罗列的不全,具体参考运算符重载 | Kotlin
下面我们以*为例,重载运算符来实现一个逻辑
在类中重载运算符
我们有个这样的代码
fun main() {
  val list = arrayListOf<Teacher>()
  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<Teacher> {
    val list = arrayListOf<Teacher>()
    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<Teacher> {
  val list = arrayListOf<Teacher>()
  repeat(n) {
    val temp = copyBean(this)
    list.add(temp)
  }
  return list
}
参考

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

    提问之前,请先看提问须知点击右侧图标发起提问 DSC0000.jpg 或者加入QQ群一起学习 DSC0001.png TornadoFx学习交流群:1071184701 DSC0002.png DSC0003.gif

   
   
   
                        

关注下面的标签,发现更多相似文章