原文: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. ChatGPT 火了,一大批开源平替也来了

    ChatGPT 凭一己之力让全球为 AI 沸腾,引发了科技巨头之间的聊天机器人军备竞赛.   众所周知,ChatGPT 的背后技术是 GPT(Generative Pre-trained Transf ...

  2. 基数排序|RadixSort|C++实现

    前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助. 高质量干货博客汇总https://blog. ...

  3. Java浅谈BufferedReader

    既然Scanner简单好用,为什么要用BufferedReader呢? 主要原因是面对大量的读入显得较慢且不安全,这里体现在三个方面,一方面是解析的问题,好用意味着封装的更复杂,一拖n的接口解析起来会 ...

  4. Excel快速调整单元格行高和列宽

    之前使用的是鼠标双击的方法,但是只适用于少量调整时. 今天给同事编辑公众号文章,有一大篇表格在word中,直接从word中复制到公众号的话,格式会有一定程度的错位. 于是先粘贴到excel中处理,但到 ...

  5. 案例:DG备库报错ORA-600[2619]致使mrp进程异常终止

    很多刚入行的DBA往往一看有ORA-600这类错误就不知所措,直接就想寻求中高级DBA支持,甚至在网上还看到有人说,判断一个Oracle DBA是否达到中级以上,就是看其是否可以独立思考处理ORA-6 ...

  6. Excel-批量填充数字

    1.一般情况下,都是使用鼠标左右键拖动来实现数据的填充的 2.但是填充1200列,下拉拖动就非常麻烦,可以首先定位到A200. 在屏幕左侧中央处找到剪切板下方的"A1"字样,鼠标单 ...

  7. Java-将Oracle中某个表的数据导出成数据文件

    在做数据开发或者ETL工作中,经常会遇到需要在客户端将Oracle数据库中的某些表的数据导出,提供给其他人员使用的情况.      下面介绍我之前实施的一种方法:(该方法不是最好的办法,但是可以勉强使 ...

  8. 教你用Rust实现Smpp协议

    本文分享自华为云社区<华为云短信服务教你用Rust实现Smpp协议>,作者: 张俭. 协议概述 SMPP(Short Message Peer-to-Peer)协议起源于90年代,最初由A ...

  9. AdvanceRestClient即食即用已集成definitions.json

    下载链接: https://pan.baidu.com/s/19Vdwda8L8PIsYc9v3S3cdA 提取码: diq8 最后完成即可使用

  10. django学习第九天---raw查询原生sql和python脚本中调用django环境和ORM锁和事务

    ORM执行原生sql语句 在模型查询api不够用的情况下,我们还可以使用原始的sql语句进行查询 方式1 raw() raw()方法,返回模型的实例django.db.models.query.Raw ...