原文: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. linux(centos) 下搭建svn服务器

     1. 使用yum安装svn yum -y install subversion 安装完成之后,验证安装结果 此命令会全自动安装svn服务器相关服务和依赖,安装完成会自动停止命令运行 若需查看svn安 ...

  2. Swift中指针UnsafePointer的常见用法

    指针类型 //基本指针 UnsafePointer<T> const T * UnsafeMutablePointer T * //集合指针 UnsafeBufferPointer con ...

  3. jetson nano ssh远程连接控制

    jetson orin nano ssh远程连接 准备:好用的网线一根,jetson orin nano一台,将网线两端连接nano的网口以及当作主机的笔记本的网口 PS:确保双方网线连接成功,网线设 ...

  4. Adoquery.Refresh 慎用。。。。非常严重,会带来各种问题。

    adoquery.refresh 各种问题,根本启不到刷新的作用.完全不刷新的节奏. 修改成已经打印后,如果用adoquery.refresh的话,这两个订单 并不会被刷新掉,惨吧......

  5. ASP.NET Core分布式项目实战(oauth密码模式identity server4实现)--学习笔记

    任务12:oauth密码模式identity server4实现 密码模式比客户端模式更加严格,需要第三方输入用户名和密码之后才可以访问 API 在 IdentityServerCenter 的 Co ...

  6. Postgresql-数据库无法停止,报错:pg_ctl server does not shut down

    根据您的查询,pg_ctl server does not shut down(pg_ctl服务无法关闭)的原因可能有很多.以下是一些可能的解决方案和代码示例: (1)杀死所有与PostgreSQL相 ...

  7. CF1913

    C 先用桶记录各个位数量. 对于每次询问,从低位到高位扫,先用掉一个当前位的,然后把当前位的全部转化成 \(cnt/2\) 个更高位的. D 有一个思路:其实删区间可以视作删相邻两个数.(然鹅这题不是 ...

  8. Python 爬虫方法总结

    实现爬虫的套路 准备URL 准备start_url url地址规律不明显,总数不确定 通过代码提取下一页的url 通过xpath提取 寻找url地址,部分参数在当前的响应中(比如当前页码数和总页码数在 ...

  9. Pandas练习

    背景介绍 本数据集包括了2015年至2017年我国36个主要一线城市.特区的一些年度数据,包括产值.人口.就业.教育.医疗.经济贸易.房地产投资等方面. 包含文件: 2015年国内主要城市年度数据.c ...

  10. 【Unity3D】卷轴特效

    1 原理 ​ 当一个圆在地面上沿直线匀速滚动时,圆上固定点的运动轨迹称为旋轮线(或摆线.圆滚线).本文实现的卷轴特效使用了旋轮线相关理论. ​ 以下是卷轴特效原理及公式推导,将屏幕坐标 (x) 映射到 ...