当前位置: 首页 > news >正文

Kotlin-运算符重载函数

在 Kotlin 里,运算符重载函数允许为自定义类型重新定义现有的运算符(如 + -…)行为,从而让自定义类型能像内置类型那样使用运算符

文章目录

  • 基本语法
  • 作用场景
    • 类对象
    • 数据类型
    • 接口
  • 注意事项

基本语法

若要重载运算符,需要定义一个带有 operator 修饰符的函数。函数名必须是 Kotlin 预定义的运算符对应的函数名。基本语法如下:

class YourClass {operator fun XXX(parameters): ReturnType {// 函数体}
}

作用场景

类对象

比如为我们的自定义类型添加加法运算

如下图所示:
+对应的函数名是plus,
+=对应的函数名是 plusAssign

在这里插入图片描述

class Student(val name: String, val age: Int) {//注意,二元运算符必须带一个形参,表示右侧的操作数operator fun plus(another: Student): Student {return Student(this.name + another.name, this.age+another.age)}
}fun main() {val stu1 = Student("海贼王 ", 2)val stu2 = Student("我当定了", 4)val result = stu1 + stu2println("(${result.name}, ${result.age})")
}

在这里插入图片描述
在这个例子中,Student类重载了 + 运算符,实现了两个 Student对象的相加。stu1 + stu2相当于stu1.plus(stu2)

接下来举一个重载一元运算符的例子,比如取反运算符:

class Student(val name: String, val age: Int) {operator fun not(): Student {return Student(name.reversed(), age)}
}fun main() {val stu1 = Student("海贼王", 2)val stu2 = !stu1println("(${stu2.name}, ${stu2.age})")
}

在这里插入图片描述
!stu1相当于stu1.not()

数据类型

尽管基本数据类型(如 Int、Double 等)的内置运算符已有默认行为,但可以为它们的扩展类型定义新的运算符行为。

// 为 Int 类型的扩展类重载 * 运算符
class Multiplier(val value: Int) {operator fun times(other: Int): Int {return this.value * other}
}fun main() {val multiplier = Multiplier(5)val result = multiplier * 3println(result)
}

在上述代码中,为 Multiplier 类重载了 * 运算符,让 Multiplier 对象可以和 Int 类型的数据进行乘法运算。

接口

如果一个类实现了特定的接口,并且接口中定义了运算符重载函数,那么该类对象也能使用这些重载的运算符。

interface Addable<T> {operator fun plus(other: T): T
}class ComplexNumber(val real: Double, val imaginary: Double) : Addable<ComplexNumber> {override operator fun plus(other: ComplexNumber): ComplexNumber {return ComplexNumber(this.real + other.real, this.imaginary + other.imaginary)}
}fun main() {val c1 = ComplexNumber(1.0, 2.0)val c2 = ComplexNumber(3.0, 4.0)val result = c1 + c2println("(${result.real}, ${result.imaginary})")
}

在这个例子中,ComplexNumber 类实现了 Addable 接口,并重载了 + 运算符,使得 ComplexNumber 对象可以使用 + 进行相加操作。

注意事项

  1. 运算符选择:只能重载 Kotlin 预定义的运算符,不能创建新的运算符。
  2. 函数签名:运算符重载函数的参数和返回值类型需要根据具体的运算符和业务需求来确定。
  3. 遵循约定:重载运算符时,应尽量遵循该运算符在数学或逻辑上的常规语义,避免造成混淆。

相关文章:

Kotlin-运算符重载函数

在 Kotlin 里&#xff0c;运算符重载函数允许为自定义类型重新定义现有的运算符(如 -…)行为&#xff0c;从而让自定义类型能像内置类型那样使用运算符 文章目录 基本语法作用场景类对象数据类型接口 注意事项 基本语法 若要重载运算符&#xff0c;需要定义一个带有 operato…...

哈希表笔记(三)Java Hashmap

一、基本介绍 HashMap 是 Java 集合框架中的核心类之一&#xff0c;基于哈希表实现&#xff0c;提供了 Map 接口的主要实现。 1.1 主要特点 实现了 Map<K,V> 接口允许 null 键和 null 值&#xff08;不同于 Hashtable&#xff09;非同步实现&#xff08;非线程安全&am…...

2025五一杯C题五一杯数学建模思路代码文章教学:社交媒体平台用户分析问题

完整内容请看文章最下面的推广群 问题一详细分析&#xff1a;逐步思考与建模过程 第1步&#xff1a;问题理解与数学建模目标明确 目标明确&#xff1a; 平台希望根据2024年7月11日至7月20日的用户与博主交互数据&#xff0c;预测2024年7月21日各博主新增的关 注数&#xff0c;…...

2025五一数学建模竞赛B题完整分析论文(共42页)(含模型、可运行代码、数据)

2025年五一数学建模竞赛B题完整分析论文 摘 要 一、问题分析 二、问题重述 三、模型假设 四、符号定义 五、 模型建立与求解 5.1问题1 5.1.1问题1思路分析 5.1.2问题1模型建立 5.1.3问题1代码 5.1.4问题1求解结果 5.2问题2 5.2.1问题2思路分析 5.2.…...

[蓝桥杯 2021 省 AB] 砝码称重 Java

import java.util.*;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();int[] w new int[n 1];int sum 0; // 所有砝码重量之和for (int i 1; i < n; i) {w[i] sc.nextInt();sum w[i];}sc.close()…...

Linux 命令如何同时支持文件参数与管道输入?

文章目录 Linux 命令如何同时支持文件参数与管道输入&#xff1f;命令输入方式与管道机制概述常见输入控制方式常见使用示例程序实现思路&#xff1a;统一处理输入的方式判定输入来源的基本模式为何命令应支持参数与标准输入&#xff1f; GNU Coreutils wc 源码解析&#xff1a…...

Lucene多种数据类型使用说明

Lucene 作为一款高性能的全文检索引擎库&#xff0c;其核心功能围绕索引和搜索文本数据&#xff0c;但它也支持多种数据类型以满足复杂的应用场景。以下是 Lucene 支持的主要数据类型及其用途的详细说明&#xff1a; 1. 文本类型&#xff08;Text&#xff09; 用途&#xff1a;…...

使用CubeMX新建DMA工程——存储器到外设模式

目录 1、新建板级支持包 1、usart.c: 2、修改的地方&#xff1a;在usart.c中添加了这些 3、usart.h: 4、在usart.h中添加了这些&#xff1a; 5、dma.c: 6、dma.h: 2、修改main.c文件 1、在main.c文件中添加头文件 2、添加外部变量声明 3、添加简单延时函数 4、添加…...

基于Redis实现-附近商铺查询

基于Redis实现-附近查询 这个功能将使用到Redis中的GEO这种数据结构来实现。 1.GEO相关命令 GEO就是Geolocation的简写形式&#xff0c;代表地理坐标。Redis在3.2版本中加入到了对GEO的支持&#xff0c;允许存储地理坐标信息&#xff0c;帮助我们根据经纬度来检索数据&#…...

【Redis】Another Redis Desktop Manager 安装指南

目录 一、Another Redis Desktop Manager 介绍 ​二、下载安装指南 三、效果预览 一、Another Redis Desktop Manager 介绍 国人开发的更快、更好、更稳定的 Redis 桌面客户端工具&#xff0c;功能强大&#xff0c;支持集群、哨兵、SSL 认证、 树状视图、自定义格式化脚本等功…...

装饰器设计模式(Decorator Pattern)详解

装饰器设计模式(Decorator Pattern)详解 装饰器模式是一种结构型设计模式,它允许动态地向对象添加额外行为,而无需修改其原始类。这种模式通过包装对象的方式提供灵活的扩展功能替代继承。 1. 核心概念 (1)模式定义 装饰器模式:动态地给一个对象添加一些额外的职责,就…...

LiteOS与SLE透传实战案例

文章目录 硬件设计EDA 软件介绍创建元件及封装原理图绘制Layout元件焊接 软件设计LiteOS 入门核心概念TaskWorkflow参考 API&#xff08;参考 osal_task. h&#xff09; 时间片任务轮转练习&#xff1a;仿写 example/peripheral/blinkyQueue参考 API&#xff08;参考 osal_msgq…...

MCAL学习(1)——AutoSAR

1.了解AutoSAR及一些概念 AutoSAR是Automotive Open System Architecture ,汽车开放系统架构。 针对汽车ECU的软件开发架构。已经是汽车电子软件开发的标准。 OS服务&#xff1a;Freertos 整车厂&#xff08;OEM&#xff09;主要负责应用层算法 一级供应商&#xff1a;生产制…...

前端vue3项目学习

鸽王经过一个多月的学习&#xff08;断断续续吧&#xff0c;毕竟还有其他杂事&#xff09;&#xff0c;学的昏天黑地&#xff0c;终于把主线捋的差不多了。只能说&#xff0c;前端真不是人学的&#xff0c;涉及的语言语法太杂乱了&#xff0c;入门真的太难了。而后端&#xff0…...

ActiveMQ 性能优化与网络配置实战(二)

五、性能优化实战 5.1 基础配置调整 5.1.1 增加并发消费者 在 ActiveMQ 中&#xff0c;增加并发消费者是提高消息处理效率的重要手段之一。通过配置多个消费者并行处理消息&#xff0c;可以充分利用系统资源&#xff0c;加快消息的消费速度&#xff0c;从而提高系统的整体吞…...

Python 函数装饰器和闭包(装饰器基础知识)

本章内容&#xff1a; Python 如何计算装饰器句法 Python 如何判断变量是不是局部的 闭包存在的原因和工作原理 nonlocal 能解决什么问题 掌握这些基础知识后&#xff0c;我们可以进一步探讨装饰器&#xff1a; 实现行为良好的装饰器 标准库中有用的装饰器 实现一个参数化装饰器…...

“Everything“工具 是 Windows 上文件名搜索引擎神奇

01 Everything 和其他搜索引擎有何不同 轻量安装文件。 干净简洁的用户界面。 快速文件索引。 快速搜索。 快速启动。 最小资源使用。 轻量数据库。 实时更新。 官网&#xff1a;https://www.voidtools.com/zh-cn/downloads/ 通过网盘分享的文件&#xff1a;Every…...

【Machine Learning Q and AI 读书笔记】- 04 彩票假设

Machine Learning Q and AI 中文译名 大模型技术30讲&#xff0c;主要总结了大模型相关的技术要点&#xff0c;结合学术和工程化&#xff0c;对LLM从业者来说&#xff0c;是一份非常好的学习实践技术地图. 本文是Machine Learning Q and AI 读书笔记的第4篇&#xff0c;对应原…...

linux下安装ollama网不好怎么办?

文章目录 前言kkgithub下载脚本,而不是直接运行修改脚本修改权限还是不行?前言 今天想在linux上面更新一下ollama,于是去到官网: https://ollama.com/download/linux linux下安装ollama还是挺简单的: curl -fsSL https://ollama.com/install.sh | sh我也是特别嗨皮地就…...

(A题|支路车流量推测问题)2025年第二十二届五一数学建模竞赛(五一杯/五一赛)解题思路|完整代码论文集合

我是Tina表姐&#xff0c;毕业于中国人民大学&#xff0c;对数学建模的热爱让我在这一领域深耕多年。我的建模思路已经帮助了百余位学习者和参赛者在数学建模的道路上取得了显著的进步和成就。现在&#xff0c;我将这份宝贵的经验和知识凝练成一份全面的解题思路与代码论文集合…...

RDMA高性能网络通信实践

RDMA高性能网络通信实践 一、背景介绍二、方法设计A.实现方案B.关键技术点三、代码及注释四、注意事项一、背景介绍 远程直接内存访问(RDMA)技术通过绕过操作系统内核和CPU直接访问远程内存,实现了超低延迟、高吞吐量的网络通信。该技术广泛应用于高性能计算、分布式存储和…...

【LeetCode Hot100】图论篇

前言 本文用于整理LeetCode Hot100中题目解答&#xff0c;因题目比较简单且更多是为了面试快速写出正确思路&#xff0c;只做简单题意解读和一句话题解方便记忆。但代码会全部给出&#xff0c;方便大家整理代码思路。 200. 岛屿数量 一句话题意 求所有上下左右的‘1’的连通块…...

图论---有向图的强连通分量(Tarjan求SCC)

强连通分量作用&#xff1a;有向图——>&#xff08;缩点&#xff09;有向无环图&#xff08;DAG&#xff09; 缩点&#xff1a;将所有连通的分量缩成一个点。 有向无环图作用/好处&#xff1a;求最短路/最长路 可以递推&#xff0c;按照拓扑图从前往后递推. x 是否在某个…...

2025年- H17-Lc125-73.矩阵置零(矩阵)---java版

1.题目描述 2.思路 &#xff08;1&#xff09;计算矩阵的行数 &#xff08;2&#xff09;计算矩阵的列数 &#xff08;3&#xff09;设计一个行列的bool数组 &#xff08;4&#xff09;遍历矩阵&#xff08;二维数组&#xff09;&#xff0c;如果遇到元素0&#xff0c;则把…...

【信息系统项目管理师-论文真题】2023下半年论文详解(包括解题思路和写作要点)

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 试题(第一批):论信息系统项目的干系人管理1、写作要点2、解题思路项目干系人管理的过程和执行要点项目中所有干系人如何进行分类管理?试题(第二批):论信息系统项目的工作绩效域1、写作要点2、解题思路绩…...

分享5款开源、美观的 WinForm UI 控件库

前言 今天大姚给大家分享5款开源、美观的 WinForm UI 控件库&#xff0c;助力让我们的 WinForm 应用更好看。 WinForm WinForm是一个传统的桌面应用程序框架&#xff0c;它基于 Windows 操作系统的原生控件和窗体。通过简单易用的 API&#xff0c;开发者可以快速构建基于窗体…...

微软推出数款Phi 4“开放式”人工智能模型

微软周三推出了几款新的“开放式”人工智能模型&#xff0c;其中功能最强大的模型至少在一个基准测试上可与 OpenAI 的 o3-mini 相媲美。所有新的授权模型——Phi 4 mini reasoning、Phi 4 reasoning 和 Phi 4 reasoning plus——都是“推理”模型&#xff0c;这意味着它们能够…...

Python实例题:Python实现Python解释器

目录 Python实例题 题目 实现思路 代码实现 代码解释 词法分析器&#xff08;Lexer&#xff09;&#xff1a; 词法单元类&#xff08;Token&#xff09;&#xff1a; 抽象语法树节点类&#xff08;AST&#xff09;&#xff1a; 语法分析器&#xff08;Parser&#xff…...

【IP101】图像滤波技术详解:从均值滤波到高斯滤波的完整指南

&#x1f31f; 图像滤波魔法指南 &#x1f3a8; 在图像处理的世界里&#xff0c;滤波就像是给图片"美颜"的魔法工具。让我们一起来探索这些神奇的滤波术吧&#xff01; &#x1f4d1; 目录 1. 均值滤波&#xff1a;图像的"磨皮"大法2. 中值滤波&#xff1…...

信息系统项目管理师-软考高级(软考高项)​​​​​​​​​​​2025最新(六)

个人笔记整理---仅供参考 第六章项目管理概论 6.1PMBOK的发展 6.2项目基本要素 组织过程资产指的是项目上的&#xff0c;国产数据库的使用----安保和安全指的是环境因素 6.3项目经理的角色 6.4价值驱动的项目管理知识体系...

算法-堆、排序算法、矩阵乘法

满二叉树、完全二叉树 二叉树遵循下面的规律&#xff0c;当前节点i&#xff08;但是其实就是逐级填充&#xff09;: 左节点为 ix2右节点为 i*21父节点为 [i/2] 向下取整 使用数组表示二叉树&#xff1a; &#xff08;二叉树的深度自上而下&#xff0c;高度自下…...

Java 进阶--集合:告别数组的“僵硬”,拥抱灵活的数据容器

作者&#xff1a;IvanCodes 发布时间&#xff1a;2025年5月1日&#x1fae1; 专栏&#xff1a;Java教程 大家好&#xff01;&#x1f44b; 还记得我们上次聊的数组 (Array) 吗&#xff1f;它很基础&#xff0c;性能也不错&#xff0c;但有个致命的缺点&#xff1a;长度一旦定…...

Python 数据智能实战 (6):用户评论深度挖掘

写在前面 —— 从繁杂评论到精准洞察:主题发现与情感趋势分析,驱动产品优化与体验提升 在上篇内容中,我们学习了如何利用 LLM 提升用户分群的精度,以及如何超越传统购物篮分析,挖掘商品间的语义关联。今天,我们将聚焦于电商领域 价值密度最高 的非结构化数据之一——用…...

podman/docker国内可用的docker镜像源(2025-05)

一、添加Docker国内镜像 1、修改 /etc/docker/daemon.json 设置 registry mirror&#xff0c;具体命令如下: sudo vim /etc/docker/daemon.json <<EOF {"registry-mirrors": ["https://docker.1ms.run","https://docker.xuanyuan.me",&q…...

机器人--底盘

机器人底盘 底盘是机器人传感器和机器人主机的载体&#xff0c;也是移动机器人的基本形式。移动机器人通常可以采用轮式和足式进行移动。 也就是机器人底盘可以分为轮式底盘和足式底盘。 足式底盘控制复杂&#xff0c;这里只讨论轮式底盘。 底盘运动学模型 轮式机器人底盘按…...

Seata服务端同步提交事务核心源码解析

文章目录 前言一、doGlobalCommit&#xff08;同步提交&#xff09;2.1、closeAndClean()2.2、changeGlobalStatus2.3、doGlobalCommit2.3.1、findGlobalSession 总结 前言 本篇介绍Seata服务端TC如何驱动RM提交事务。 一、doGlobalCommit&#xff08;同步提交&#xff09; doG…...

2025五一杯B题五一杯数学建模思路代码文章教学: 矿山数据处理问题

完整内容请看文章最下面的推广群 问题1. 根据附件1中的数据和&#xff0c;建立数学模型&#xff0c;对数据A进行某种变换&#xff0c;使得变换后的结果与数据尽可能接近。计算变换后的结果与数据的误差&#xff0c;并分析误差的来源&#xff08;如数据噪声、模型偏差等&#xf…...

C++11新特性_自动类型推导

decltype 和 auto 均为 C 里用于类型推导的关键字&#xff0c;不过它们在使用方式、推导规则和应用场景上存在显著差异。下面为你详细介绍它们的区别&#xff1a; 1. 推导依据 auto&#xff1a;它依据变量的初始化表达式来推导类型。也就是说&#xff0c;auto 定义的变量必须有…...

【AI论文】ReasonIR:为推理任务训练检索器

摘要&#xff1a;我们提出了ReasonIR-8B&#xff0c;这是第一个专门针对一般推理任务进行训练的检索器。 现有的检索器在推理任务上表现出的收益有限&#xff0c;部分原因是现有的训练数据集侧重于与直接回答它们的文档相关的简短事实查询。 我们开发了一个合成数据生成管道&am…...

嵌入式AI还是一片蓝海

发现其实还是挺多人关注嵌入式和人工智能交叉领域的&#xff0c;随便一个问题&#xff0c;浏览量就27万了&#xff0c;但是这方面的内容确实少得可怜……所以干脆我自己来补点干货。 推荐一本最近很热门的新书——《边缘人工智能&#xff1a;用嵌入式机器学习解决现实问题》。 …...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(13): ておきます ています & てあります

日语学习-日语知识点小记-构建基础-JLPT-N4阶段&#xff08;13&#xff09;&#xff1a; ておきます &ています &#xff06; てあります 。 1、前言&#xff08;1&#xff09;情况说明&#xff08;2&#xff09;工程师的信仰 2、知识点&#xff08;1&#xff09;&#x…...

CMake管理外部依赖的模块

在 CMake 中&#xff0c;FetchContent 和 ExternalProject 都是管理外部依赖的模块&#xff0c;但它们的 设计目标、使用场景和执行时机 有本质区别。以下通过对比表格、代码示例和场景分析详细说明它们的区别。 核心区别对比表 特性FetchContentExternalProject执行阶段配置阶…...

[计算机科学#7]:CPU的三阶段,取指令、解码、执行

【核知坊】&#xff1a;释放青春想象&#xff0c;码动全新视野。 我们希望使用精简的信息传达知识的骨架&#xff0c;启发创造者开启创造之路&#xff01;&#xff01;&#xff01; 内容摘要&#xff1a;本文详细介绍了CPU的工作原理&#xff0c;包括其结构…...

向量数据库和关系型数据库的区别,优点,缺点和典型应用场景

向量数据库与关系型数据库的全面对比 向量数据库和关系型数据库是两种截然不同的数据管理系统&#xff0c;各自针对特定的数据模型和查询模式进行了优化。随着人工智能和大数据技术的发展&#xff0c;向量数据库作为新兴的数据库类型&#xff0c;在处理非结构化数据方面展现出…...

《跨越边界:探索跨端框架中通用状态管理方案设计》

一款应用往往需要在多个终端&#xff0c;如Web、移动端、桌面端等同时运行&#xff0c;以满足用户多元化的使用场景。在这复杂的跨端开发领域中&#xff0c;状态管理堪称关键枢纽&#xff0c;直接关乎应用的性能、稳定性以及开发与维护的效率。如何设计一套通用的状态管理方案&…...

PHP之CURL通过header传参数及接收

一、传参数之冒号 注意一点&#xff0c;这里的header数据不是KV结构&#xff0c;而是一个一维数组。 看清楚&#xff0c;注意一点&#xff0c;是这样的结构&#xff1a; $ch curl_init(); $headers [X-Custom-Header: value123,Authorization: Bearer your_token_here // …...

【C++】brpc安装

brpc安装教程 环境&#xff1a;Ubuntu24.04 1 简单安装 即安装到系统环境下&#xff0c;依赖也是依赖apt安装。 官方参考教程 依赖准备 安装依赖&#xff1a; sudo apt-get install -y git g make libssl-dev libgflags-dev libprotobuf-dev libprotoc-dev protobuf-com…...

从0开始的c++知识讲解之字符串(1)

作者作为新手&#xff0c;对于知识的讲解也是边输出内容也是边学习&#xff0c;如有缺陷&#xff0c;请多海涵&#xff0c;但同样&#xff0c;我会帮助你从新手视角看到新手的疑惑&#xff0c;并帮助你解决此疑惑 一&#xff0c;开宗明义&#xff0c;立意先行 string在C里有可…...

Linux 第六讲 --- 工具篇(一)yum/apt与vim

前言&#xff1a; 经过前五讲对Linux基础指令与权限系统的系统学习&#xff0c;相信你已经能在命令行中自如地穿梭于文件丛林&#xff0c;精准调配权限密钥。但真正的Linux玩家&#xff0c;绝不会止步于基础操作的重复劳作。 从今天起&#xff0c;我们将打开Linux的"瑞士…...

xml 和 yaml 的区别

XML 和 YAML/YML 是两种常用的数据序列化格式&#xff0c;用于存储和读取结构化数据。以下是它们的核心区别和使用方法&#xff1a; 1. 格式特性对比 特性XMLYAML/YML语法复杂度标签嵌套&#xff0c;结构严格缩进分层&#xff0c;更简洁可读性较低&#xff08;冗余标签&#…...