侧边栏壁纸
博主头像
Stars-one博主等级

所有的创作都是具有价值的
Android Kotlin Java开发者,喜欢折腾搞机,开发小工具

  • 累计撰写 169 篇文章
  • 累计创建 44 个标签
  • 累计收到 10 条评论

目 录CONTENT

文章目录

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

Stars-one
2022-08-15 / 0 评论 / 0 点赞 / 9 阅读 / 739 字

本文为作者原创,允许转载,不过请在文章开头明显处注明链接和出处!!! 谢谢配合~
作者:stars-one
链接:https://stars-one.site/2022/08/15/kotlin-study-10

原文: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[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) |

可能罗列的不全,具体参考运算符重载 | 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
}

参考

0

评论区