Kotlin 基础学习笔记第七章——运算符重载及其他约定

news2024/11/27 2:23:46

        如你所知,java在标准库中有一些与特定的类相关联的语言特性。例如,实现java.lang.Iterable接口的对象可以在for循环中使用;实现了java.lang.AutoCloseable接口的对象可以在try-with-resource语句中使用

一、重载算术运算符

        1、重载二元运算符        

         注意,如何使用operator关键字来声明plus函数。用于重载运算符的所有函数都需要用该关键字来标记,用来表示你打算把这个函数作为相应的约定的实现,并且不是碰巧地定义一个同名函数

        在使用了operator修饰符声明了plus函数之后,你就可以直接使用+号来求和了。事实上,这里它调用的是plus函数。

        除了把这个运算符声明为一个成员函数外,也可以把它定义为一个扩展函数

        和其他一些语言相比,在kotlin中不管是定义还是使用重载运算符都更为简单,因为你不能定义自己的运算符。kotlin限定了你能重载哪些运算符,以及您需要在你的类中定义的对应名字的函数。         

         自定义类型的运算符,基本上和标准数字类型的运算符有着相同的优先级。例如,如果是a + b * c,乘法将始终在添加之前执行,即使你已经自己定义了这些运算符。        

        当你在定义一个运算符的时候,不要求两个运算数是相同的类型。例如,让我们定义一个运算符,它允许你用一个数字来缩放一个点,可以用它在不同坐标系之间做转换。

         注意,kotlin中运算符不会自动支持交换性(交换运算符的左右两边)。如果希望用户能够使用1.5 * p以外,还能使用p * 1.5,你需要为它定义一个单独的运算符:operator fun Double.times(p: Point): Point。

        运算符函数的返回类型也可以不同于任一运算数的类型。        注意,和普通的函数一样,可以重载operator函数:可以定义多个同名的,但是参数类型不同的方法。

 2、重载复合赋值运算符

        通常情况下,当你在定义像plus这样的运算符函数时,kotlin不止支持+号运算,也支持+=。像+=、-=等这些运算符被称为复合赋值运算符

        在一些情况下,定义+=运算可以修改使用它的变量所引用的对象,但不会重新分配引用。将一个元素添加到可变集合,就是一个很好的例子:

    如果你定义了一个返回值为Unit,名为plusAssign的函数,kotlin将会在用到+=运算符的地方调用它。其他二元算术符也有命名相似的对应函数:如minusAssign、TimesAssign等。

        kotlin标准库为可变集合定义了plusAssign函数。

         当你在代码中用到了+=的时候,理论上plus和plusAssign都可能被调用。如果在这种情况下,两个函数都有定义且适用,编译器会报错一种可行的解决办法是:替换运算符的使用为普通函数调用。另一个办法是,使用val替代var,这样plusAssign运算符就不再适用。但一般来说,最好一致地设计出新的类:尽量不要同时给一个类添加plus和plusAssign运算。如果像前面的一个示例中的Point,这个类是不可变的,那么就应该只提供返回一个新值(如plus)的运算。如果一个类是可变的,比如构建器,那么只需要提供plusAssign和类似的运算就够了

         kotlin标准库支持集合的这两种方法。+和-运算符总是返回一个新的集合。+=和-=运算符用于可变集合时,始终在一个地方修改它们:而它们用于只读集合时,会返回一个修改过的副本(这意味着只有当引用只读集合的变量被声明为var的时候,才能使用+=和-=)。作为它们的运算符,可以使用单个元素,也可以使用元素类型一致的其他集合。

        最后来看看集合的二元运算符是如何实现的。

/**
 * Returns a list containing all elements of the original collection and then the given [element].
 */
public operator fun <T> Collection<T>.plus(element: T): List<T> {
    val result = ArrayList<T>(size + 1)
    result.addAll(this)
    result.add(element)
    return result
}
/**
 * Adds the specified [element] to this mutable collection.
 */
@kotlin.internal.InlineOnly
public inline operator fun <T> MutableCollection<in T>.plusAssign(element: T) {
    this.add(element)
}

        

        

 

 

 

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/27286.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IIC的使用

借鉴于&#xff1a;蓝桥杯嵌入式快速通关篇&#xff0c;IIC通讯及EEPROM_穿上我的格子衫的博客-CSDN博客 IIC原理超详细讲解---值得一看_Z小旋的博客-CSDN博客_iic 总线空闲&#xff1a;SDA 1,SCL 1; 启动信号&#xff1a;SCL 1,SDA 1 -> 0; 停止信号&#xff1a;SCL …

【王道计算机网络笔记】物理层-通信基础

文章目录物理层接口特性典型的数据通信模型数据通信相关术语三种通信方式&#xff08;交互方式&#xff09;串行传输&并行传输&#xff08;数据传输方式&#xff09;同步传输&异步传输码元速率带宽失真失真的一种现象——码间串扰奈氏准则&#xff08;奈奎斯特定理&…

矩阵股份上市首日跌破发行价:振幅达10%,王冠为实际控制人

11月22日&#xff0c;矩阵纵横设计股份有限公司&#xff08;下称“矩阵股份”&#xff0c;SZ:301365&#xff09;在深圳证券交易所创业板上市。本次上市&#xff0c;矩阵股份的发行价为34.72元/股&#xff0c;发行数量为3000万股&#xff0c;募资总额约为10.42亿元&#xff0c;…

SpringBoot SpringBoot 开发实用篇 5 整合第三方技术 5.15 SpringBoot 整合 task

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇5 整合第三方技术5.15 SpringBoot 整合 task5.15.1 SpringBoot 整合 …

对zygote的理解

一、 zygote的作用 启动SystemServer SystemServer需要用于zygote准备好的一些系统资源&#xff0c;比如常用类、注册的JNI函数、主题资源、共享库等等&#xff0c;直接从zygote那继承过来&#xff0c;SystemServer就不用重新再加载一遍&#xff0c;这样对性能有很大的提升。 …

CRM系统中联系人管理的十大好处

联系人管理通常是你的CRM策略中的一个关键部分。它是存储和组织联系人数据以便于访问的做法。简而言之&#xff0c;就是管理联系人数据的过程。如今联系人管理已内置到 CRM 系统中。因此&#xff0c;我们可以考虑利用系统软件将以下优点应用于联系人管理中。 1、更好、更持久的…

Matplotlib用法使用、Matplotlib绘图作图画图

一、Matplotlib Matplotlib&#xff1a;专门用于开发2D或3D图表&#xff0c;以渐进、交互式方式实现数据可视化 可视化是在整个数据挖掘的关键辅助工具&#xff0c;可以清晰的理解数据&#xff0c;从而调整我们的分析方法 能将数据进行可视化&#xff0c;更直观的呈现使数据…

希望所有计算机学生能看到这篇c语言教程

大部分程序员走入编程世界第一个学习的语言就是C语言。 作为一门古老的编程语言&#xff0c;c语言拥有48年的发展历程。 为什么要学习 C语言&#xff1f; C语言是学习计算机程序设计语言的入门语言。C语言是一门偏底层的语言&#xff0c;学好它&#xff0c;可以让你更好的了…

E - Fire! (双向bfs)

UVA-11624-Fire! 题意&#xff1a;在n*m的网格内&#xff0c;有一个人和n堆火&#xff0c;人可以往上下左右四个方向走&#xff0c;同时所有的火也会想四周蔓延&#xff0c;问你人可不可以在火包围他之前逃离这个n*m的范围。 思路&#xff1a;问人可不可以逃离这个范围&#xf…

m基于VDLL的矢量型GPS信号跟踪算法matlab仿真

目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 载波跟踪环是传统独立式GPS接收机最脆弱的环节&#xff0c;针对弱信号环境下其比伪码跟踪环路更容易失锁的问题&#xff0c;给出一种基于矢量频率锁定环&#xff08;vector-frequency lo…

集成学习-Boosting

Boosting 采用串行的方式训练&#xff0c;各基分类器之间有依赖。根据当前模型损失函数的负梯度训练新的弱分类器&#xff0c;将训练好的弱分类器以累加的形式结合到现有模型中。 过程中会不断减小损失函数&#xff0c;使模型偏差不断降低&#xff0c;方差不会降低。因为各弱分…

《CTFshow - Web入门》02. Web 11~20

Web 11~20web11知识点题解web12知识点题解web13知识点题解web14知识点题解web15知识点题解web16知识点题解web17知识点题解web18知识点题解web19知识点题解web20知识点题解web11 知识点 dns检查查询&#xff1a;http://dbcha.com/&#xff0c;输入域名&#xff0c;获取flag。…

MySQL数据库期末考试试题及参考答案(07)

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 一、 填空题 如果不想提交当前事务&#xff0c;可以使用_____语句回滚事务。每个事务都是完整不可分割的最小单元是事务的_____性。MySQL中&#xff0c;显式开启事务的语句…

屏幕视频捕获组件-ByteScout Screen Capturing SDK

使用 ByteScout Screen Capturing SDK&#xff0c;您可以轻松地将屏幕视频捕获功能添加到您的应用程序中。输出带有音频、鼠标移动和点击的高质量桌面屏幕视频录制。 主要优势 只需几行代码即可在您的应用中启用屏幕视频捕获和屏幕录制功能&#xff1b;无需互联网连接即可离线…

Django day1

在windows下可以直接的创建django项目 但是需要把自动生成的templates和setting里面的DIRS里面字段删除&#xff08;templates自动生成的可以删不删都行&#xff0c;我是看视频那个老师删了&#xff0c;但是setting DIRS里面的字段需要删&#xff0c;至于具体为啥我已经忘了&am…

TiDB数据库概述——PD

PD PD的架构与功能TSO的分配PD的调度原理label的作用 PD的架构 PD的个数一般是奇数个的。 PD的主要功能&#xff1a; 整个集群TiKV的元数据存储分配全局ID和事务ID生成全局时间戳TSO收集群信息进行调度提供label&#xff0c;支持高可用提供TiDB Dashboard 路由功能 用key…

vue3使用富文本编辑器wangEditor-v5(未使用composition api写法)

效果 安装 安装核心库和其vue组件库 yarn add wangeditor/editor yarn add wangeditor/editor-for-vuenext使用v-model封装富文本组件editor.vue <template><div class"editor-box"><Toolbar class"toolbar" :editor"editor" …

Flink是什么?场景?处理流的发展演变?

Flink是什么&#xff1f;Flink是什么&#xff1f;为什么选择Flink&#xff1f;什么场景需要处理流数据?处理流的发展演变Flink是什么&#xff1f; Apache Flink 是一个在无界和有界数据流上进行状态计算的框架和分布式处理引擎。Flink 能在所有常见集群环境中运行&#xff0c…

线性表的链式存储的基本

链表是线性表的链式存储方式&#xff0c;逻辑上相邻的数据在计算机内的存储位置不一定相邻&#xff0c;因此&#xff0c;我们需要为每一个元素设置有一个指针来指向与它逻辑相邻的元素。 为此&#xff0c;我们为每个元素设置一个结点&#xff0c;每个结点由数据域和指针域组成…

【3D目标检测】Monocular 3D Object Detection with Pseudo-LiDAR Point Cloud

目录概述整体流程伪点云vs点云2D-3D边界框的一致性约束概述 本文的输入数据仅仅是单目图像&#xff0c;在方法上是融合了伪点云&#xff08;Pseudo-LiDAR&#xff09;的深度信息表示方法与Frustum PointNets的检测方法。 乍一看文章和伪点云原论文Pseudo-LiDAR from Visual De…