原文: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
}

参考

Kotlin学习快速入门(10)—— 重载运算符使用的更多相关文章

  1. Kotlin学习快速入门(7)——扩展的妙用

    原文地址: Kotlin学习快速入门(7)--扩展的妙用 - Stars-One的杂货小窝 之前也模模糊糊地在用这个功能,也是十分方便,可以不用继承,快速给某个类增加新的方法,本篇便是来讲解下Kotl ...

  2. Kotlin学习快速入门(2)——条件 数组 循环 方法

    条件 if条件判断 常用的判断和Java一样,这里提一下不同的用法 1.if可以作为三元运算符 val max = if (a > b) a else b 2.使用in判断是否在某个区间 val ...

  3. Kotlin学习快速入门(1)——基本数据类型以及String常用方法使用

    本文适合有Java基础的人 Kotlin语法特点 相比java,省略括号,可以自动判断类型,省略new关键字,空指针捕获 主函数 kotlin文件(kt文件)中,只有要下列的方法,就可以运行,无需像之 ...

  4. Kotlin学习快速入门(4)——集合使用

    List,Set,Map都是集合 List 是一个有序集合,可通过索引(反映元素位置的整数)访问元素.元素可以在 list 中出现多次.列表的一个示例是一句话:有一组字.这些字的顺序很重要并且字可以重 ...

  5. Kotlin学习快速入门(3)——类 继承 接口

    类 参考链接 类定义格式 使用class关键字定义,格式如下: class T{ //属性 //构造函数 //函数 //内部类 } Java Bean类 java bean类 //java bean类 ...

  6. Kotlin学习快速入门(5)——空安全

    介绍 kotlin中,对象可分为两种类型,可为空的对象和不可为空对象 默认为不可为空对象,代码检测如果发现不可为空对象赋予了null,则会标红报错. 可为空的对象,如果调用了方法,代码检测也会标红报错 ...

  7. 吴裕雄--天生自然C++语言学习笔记:C++ 重载运算符和重载函数

    C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载. 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现)不 ...

  8. pytest学习--快速入门

    一.pytest简介 Pytest是python的一种单元测试框架. pytest的特点: 入门简单,文档丰富 支持单元测试,功能测试 支持参数化,重复执行,部分执行,测试跳过 兼容其他测试框架(no ...

  9. pytorch入门--土堆深度学习快速入门教程

    工具函数 dir函数,让我们直到工具箱,以及工具箱中的分隔区有什么东西 help函数,让我们直到每个工具是如何使用的,工具的使用方法 示例:在pycharm的console环境,输入 import t ...

  10. spring boot快速入门 10: 日志使用

    第一步:pom 文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=" ...

随机推荐

  1. 中兴BE7200Pro+的WIFI 7路由器开箱

    上一个讨论的帖子:https://www.chiphell.com/thread-2573626-1-1.html . 对应小米WIFI 7路由器BE6500 Pro开箱的帖子:https://www ...

  2. P3730 曼哈顿交易 题解

    题目链接:曼哈顿交易 比较容易想的题,观察下首先不带修改,考虑维护的东西:次数作为权值,这玩意很显然很难在线维护,考虑下离线算法.看到这种和次数有关的权值,典型的单点加入和删除是非常好找到变化的,那么 ...

  3. 制作包含最新更新的Windows 10 LTSC 2021 ISO

    介绍 在制作桌面云windows 模板的时候,一般需要安装最新的更新.更新安装过程非常耗时,并且安装更新会导致桌面模板的磁盘空间膨胀.制作出的模板会占用很大的磁盘空间.如果不安装更新,模板大小约5G. ...

  4. Python中os.walk函数说明

    这个函数对于文件方面的遍历等其他方面的操作来说功能很强大,比如批量修改文件名.批量移动文件.将所有不在一个文件夹下的文件移动到同一个文件夹下等等. 这个其实很简单的,用一个示例就能明白这个函数的具体用 ...

  5. JAVA生成随机数工具类RandomStringUtils详解

    public static String random(int count, boolean letters, boolean numbers) /** * count 创建一个随机字符串,其长度是指 ...

  6. Linux--split命令(将一个大文件拆分成多个小文件)

    一.split命令简介 split是Linux系统中的一个文件拆分命令,它可以将一个大文件拆分成多个小文件.这对于处理大型文件,或者需要将数据分解到多个文件中的场景非常有用. 二.split命令的使用 ...

  7. 动态获取input内容文本(排除候选拼音文本) - js事件

    要想通过事件实时获取文本框文本,一开始是想到下面的方法,但实际效果都存在一定的缺点. 通过change/blur事件获取 change事件只有在选中点击或者失焦的时候,才能够触发. blur事件则是只 ...

  8. 浅谈 2-SAT

    SAT 是适定性(Satisfiability)问题的简称.一般形式为 k - 适定性问题,简称 k-SAT.而当 \(k>2\) 时该问题为 NP 完全的.所以我们只研究 \(k=2\) 的情 ...

  9. LGV引理

    LGV引理是用来统计DAG中固定若干起点和终点情况下的选择不相交链的方案数的. 同样用来优化计数问题,但是比Pólya定理友好多了,这也就是为什么它能够被直接糊到NOI考场上. 对于一张DAG,每条边 ...

  10. NC53074 Forsaken喜欢独一无二的树

    题目链接 题目 题目描述 ​ 众所周知,最小生成树是指使图中所有节点连通且边权和最小时的边权子集. ​ 不过最小生成树太简单了,我们现在来思考一个稍微复杂一点的问题. ​ 现在给定一个 \(n\) 个 ...