Kotlin - 运算符重载

S4 Hana SD -信贷管理 - 02 在S4版本中,客户的信用管理数据在事务代码BP维护,业务伙伴角色是UKM000。在维护过程中,我们并不能直接输入信贷控制范围这个组织架构,而是需要输入一个信用段,并且在信用段的维度下去维护相应信用管理数据。对于信用段,可以分为主信用段(信用段是0000)和其他临时信用段,我们可以通过配置把次级信用段的客户信贷负债汇总到主信用段。当然,在后台也有配置,会把信用段和信贷控制范围这两者进行关联.3.2SPROIMG > 财务供应链管理 > 信用管理 > 信贷风险监视 > 主数据 > 创建信用段。 阅读详情

Kotlin支持标准的算术运算表达式, 其中运算符被声明为相应类的成员。

Kotlin源代码中,我们可以自定义类型的运算符实现,即运算符的重载。这些运算符有固定的表示, 和固定的优先级。Kotlin为基本类型提供了固定名称的数值函数,比如二元运算符的左值和一元运算符的参数类型。

运算符的优先级

运算符的优先级

运算符重载

预定义的运算符的操作对象只能是基本数据类型,实际上,对于很多用户自定义类型,也需要有类似的运算操作。

运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据导致不同类型的行为。

运算符重载的实质是函数重载。在实现过程中,首先把指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参,然后根据实参的类型来确定需要调用达标函数,这个过程爱编译过程中完成。

一元运算符

算数运算符

表达式转换
+aa.unaryPlus()
-aa.unaryMinus()
!aa.not()


以表达式 +a为例,编译器的运行流程如下:

1. 确定a的类型,假设为T
2. 查找具有操作符修饰符的无参函数unaryPlus(),并且没有用于接收者T的参数,比如数值函数或扩展函数。
3. 如果函数返回类型R,那么它必须是T的子类型。


注:这些操作符和其它的一样, 其操作的数据都被优化为基本类型并且不会产生多余的开销

自增自减

这里写图片描述

计算表达式的效果


1. 把 a 的初始值存储在 a0 中
2. 把 a.inc() 的结果作用在 a 上
3. 把 a0 作为表达式的返回值

二元操作符

算术操作符

表达式转换
a + ba.plus(b)
a - ba.minus(b)
a * ba.times(b)
a / ba.div(b)
a % ba.mod(b)
a..ba.rangeTo(b)

编辑器只会处理“转换列中的表达式”

表达式转换
a in bb.contains(a)
a !in b!b.contains(a)

in 和 !in 的产生步骤是一样的, 但参数顺序是相反的

标志转换
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] = ba.set(i, b)
a[i,j] =ba.set(i, j, b)
a[i_1, … , i_n] = ba.set(i_1,… ,o_n,b)

方括号被转换为 get set 函数

标志转换
a(i)a.invoke(i)
a(i, j)a.invoke(i, j)
a(i_1, … , i_n)a.invoke(i_1, …, i_n)

括号被转换为带有正确参数的 invoke 参数

表达式转换
a += ba.plusAssign(b)
a -= ba.minusAssign(b)
a *= ba.timesAssign(b)
a /= ba.divAssign(b)
a %= ba.modAssign(b)

以a += b为例分析编辑器运行

  • 如果右列的函数可用
    1. 确保相应的二进制函数(即plusAssign()的plus())也可用,否则发送错误报告
    2. 确保其返回类型为Unit,否则发送错误报告
      3.生成a.plusAssign(b)代码端
  • 如果右列的函数不可用,尝试为a = a + b生成代码(包括类型检查:+ b的类型必须是a的子类型)。
表达式转换
a == ba?.equals(b) ?: b.identityEquals(null)
a != b!(a?.equals(b) ?: b.identityEquals(null))


注意 === !== 是不允许重载的

  1. ==

    1. 如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等(若类型不同,高级转化为基础类型);
    2. 如果作用于引用类型的变量,则比较的是所指向的对象的地址
  2. equals

    1. equals方法不能作用于基本数据类型的变量
    2. 如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
      3.诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。
  3. ===
    1. 对于基本数据类型,如果类型不同,其结果就是不等。如果同类型相比,与“==”一致,直接比较其存储的 “值”是否相等;
    2. 对于引用类型,与“==”一致,比较的是所指向的对象的地址
表达式转换
a > ba.compareTo(b) > 0
a < ba.compareTo(b) < 0
a >= ba.compareTo(b) >= 0
a <= ba.compareTo(b) <= 0

所有的比较都转换为 compareTo 的调用, 这个函数需要返回 Int 值

位运算

对于位运算,Kotlin 并没有提供特殊的操作符, 只是提供了可以叫中缀形式的方法, 比如:

val x = (1 shl 2) and 0x000FF000

下面是全部的位运算操作符(只可以用在 Int 和 Long 类型):

  • shl(bits) – 有符号左移 (相当于Java <<)
  • shr(bits) – 有符号右移 (相当于Java >>)
  • ushr(bits) – 无符号右移(相当于Java >>>)
  • and(bits) – 按位与
  • or(bits) – 按位或
  • xor(bits) – 按位异或
  • inv() – 按位取反

示例代码

Data Class

data class OperatorOverride(var name: String, var age: Int) {
    // 重载 +a
    operator fun unaryPlus() : OperatorOverride{
        age = age.plus(100)
        return  this
    }

    // 重载 a++
    operator fun inc() : OperatorOverride {
        age += 10
        return  this
    }

    // 重载 a+b
    operator fun plus(oo: OperatorOverride): OperatorOverride {
        age += oo.age
        return  this
    }
    // 重载 equals
    override fun equals(other: Any?): Boolean {
        if (other is OperatorOverride) {
            return this.age > other.age
        }
        return false
    }
}

Test

fun main(args: Array<String>) {

    var oo : OperatorOverride = OperatorOverride("zhang", 10)

    println("----------------------------------")

    println("原oo = ${oo}")
    +oo
    println("新oo = ${oo}")

    println("----------------------------------")

    println("----------------------------------")

    println("原oo = ${oo}")
    oo++
    println("新oo = ${oo}")

    println("----------------------------------")


    println("----------------------------------")
    val  o : OperatorOverride = OperatorOverride("zhao", 43)
    println("原oo = ${oo}")
    println("新oo = ${oo + o}")

    println("----------------------------------")

    println("----------------------------------")

    println(oo.equals(o)) // oo的age为120,o的age为43,故返回true

    println("----------------------------------")
}

Log打印

----------------------------------
原oo = OperatorOverride(name=zhang, age=10)
新oo = OperatorOverride(name=zhang, age=110)
----------------------------------
----------------------------------
原oo = OperatorOverride(name=zhang, age=110)
新oo = OperatorOverride(name=zhang, age=120)
----------------------------------
----------------------------------
原oo = OperatorOverride(name=zhang, age=120)
新oo = OperatorOverride(name=zhang, age=163)
----------------------------------
----------------------------------
true
----------------------------------
虚幻商城 蓝图汇总 虚幻引擎是一个非常强大和灵活的游戏开发工具,拥有众多的蓝图可以帮助我们更高效地工作。 阅读详情

相关推荐

电赛控制组入门到实战:从电路板到PID算法的完整路径

本文详细介绍了电赛控制组从电路板制作到PID算法实战的完整学习路径。涵盖嘉立创电路设计、Keil5开发环境搭建、STM32F103C8T6核心板外设应用,重点解析PID算法在电机速度环与位置环中的调试技巧,并探讨OpenMV视觉模块与主控制器的协同工作,为电赛参赛者提供系统化的实战指南。

oauth7security的博客 745

Kotlin重载运算符operator

定义 运算符重载就是对已有的运算符赋予他们新的含义。重载的修饰符是operator。 比如我们的+号,它的含义是两个数值相加:1+1=2。+号对应的函数名是plus 比如我们定义一个类,如何才能使用 + 这个符号呢?其实也很简单,使用 operator 重载 plus 函数就能搞定,我们试试吧 重载 plus 首先我们定义一个类 Point ,然后重载 plus 函数 class Point(private val x: Int, private val y: Int) { operator fu

赵彦军 5853

高功率半导体叠阵激光快慢轴准直优化技术解析

本文深入解析了高功率半导体叠阵激光快慢轴准直优化技术。针对其光束发散特性,文章系统阐述了从光源建模、光学仿真到透镜选型与参数匹配的完整工程流程,并强调了光束整形对于提升加工精度与效率的核心作用。通过优化快慢轴准直,可将原始散光转变为能量集中、均匀性好的高质量光束,为后续工业应用奠定基础。

php55的博客 713

Kotlin基础学习(十八)—— Kotlin 运算符重载与约定

Kotlin

123 1639

SAP SD实战:用BADI_SLS_HEAD_SCR_CUS给销售订单VA01/VA02加自定义字段(附完整函数组代码)

本文详细解析了在SAP SD模块中如何利用BADI_SLS_HEAD_SCR_CUS实现销售订单(VA01/VA02)的屏幕增强,包括数据结构设计、函数组创建和BADI接口实现。通过实战案例和完整代码,帮助开发者掌握在SAPMV45A标准流程中添加自定义字段的关键技术,提升业务定制化能力。

weixin_27015733的博客 368

最优化理论与自动驾驶(三):LQR原理、公式及代码演示

LQR 是基于线性系统和二次型代价函数的最优控制方法,在实际工程应用中,我们一般采用离散时间系统的LQR设计,其目标是通过设计反馈控制律,使系统在离散时间步长内稳定运行,最小化某个二次型代价函数。给定一个离散时间系统,其状态和控制输入通过以下方程表示:是时刻k的系统状态,是时刻k的控制输入,是状态转移矩阵,是输入矩阵。系统描述的物理意义:系统状态通过矩阵A演变到下一时刻,同时控制输入通过矩阵B影响系统的状态。

a8598671的博客 4595

kotlin基础——重载

使用operator定义plus()方法后,可以直接使用+号求和若定义为扩展函数,也可实现可供选择的重载运算有如下,不会自动支持交换性不要求两个运算数是相同类型返回类型也可不同于任一运算数类型Kotlin中的位运算符如下。

松仔Log的博客 1764

SAP-ABAP:SAP中如何查看系统表之间的关联关系?

在业务逻辑开发或者ALV开发过程中,我们通常要从系统中找出几个标准表之间的关联关系,有的是head与item,通过外键进行关联的关系。那么怎么去找到呢?以上就是具体如何产看系统表之间的关联关系的步骤,对于不同代码的业务顾问,也是必须要掌握的。

LinkStar的博客 2430

Kotlin笔记--运算符重载

运算符重载 1 重载算术运算符 Kotlin可以通过扩展函数的机制为现有的类增添新的方法。可以把任意约定方法定义为扩展函数,从而适应任何现有的Java类而不用修改其代码。 .1重载二元算术运算 定义一个 plus 运算符 data class Point(val x: Int, val y: Int) { operator fun plus(other: Point): Point { return Point(x + other.x, y + other....

ljt2724960661的博客 799

无迹卡尔曼滤波 (UKF, Unscented Kalman Filter) 算法详解及案例分析

无迹卡尔曼滤波是一种用于估计非线性系统状态的递归算法。其目标是通过结合系统模型和观测数据,估计系统的最优状态。

闲人编程的博客 2625

【云原生之Docker实战】使用docker部署Monica个人开源CRM系统

【云原生之Docker实战】使用docker部署Monica个人开源CRM系统

jks212454的博客 2384

七、kotlin的运算符重载、约定和委托

如果我们定义了个 的操作符重载函数, 那么就可以在该类的实例上使用 运算符, 这就是 规定了很多这种规定, 但这些规定程序员都可以不需要知道, 只要依靠 的智能提示就行了定义一个成员的 操作符重载函数 可以看出使用的是修饰符 定义一个操作符重载函数根据约定概念对应了运算符的 对应的可重载的函数还有:不会导致 的优先级低于 操作符左右两边的类型可以不一样 需要注意: 操作符重载函数的左右两边顺序不可以调换, 上面定义的函数 类型为左, 类型为右, 所以 是不可以的, 如果需要则

bangiao的博客 4685

把 MCP Server 直接装进 SAP ABAP:用 Unlimited Display Tools 打通 Agentic SDK 与 SAP ECC / S/4HANA 的最后一公里

摘要:AI与SAP集成的MCP解决方案 企业在AI集成中面临工具链复杂、数据对接繁琐的挑战。Model Context Protocol (MCP)通过标准化工具与数据暴露方式,将集成复杂度从N×M降至N+M。在SAP生态中,MCP Server for SAP直接部署于ABAP层,利用DDIC/CDS视图对接各类Agent SDK,避免中间件风险。 MCP核心包含三类对象: Tools:带元数据的可执行动作 Resources:结构化上下文数据 Prompts:可参数化提示模板 ABAP层实现MCP Se

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 680

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

kotlin 运算符重载

liuqinhou的博客 1292

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Kotlin重载运算符

什么是运算符重载? 简单来说,就是Kotlin通过调用自己代码中定义特定的函数名的函数(成员函数或者扩展函数),并且用operator修饰符标记,来实现特定的语言结构,例如如果你在一个类上面定义了一个特定函数命名plus的函数,那么按照Kotlin的约定,可用在这个类的实例上使用+运算符,下面是代码。 用于重载运算符的所有函数都必须使用operator关键字标记。 // 一个简单的数据类 da...

SHELTER_7的博客 318

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Kotlin运算符重载总结

运算符的重载是一个十分方便的特性,它让代码看起来更加的直观,写起来也更加的方便。在学C++的时候就十分喜欢这一语言特性。然而Java却对这一点没有任何的支持。现在同样作为JVM语言的Kotlin加入了运算符重载这一语言特性。接下来让我们看看,在Kotlin中究竟有哪些运算符可以重载呢?一元运算符

feint123的博客 1292

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

kotlin 基础之运算符重载

我们知道Java 中是不允许运算符重载的,1+1,输出肯定是2,kotlin 则可以重载。可见 kotlin 官网 '+' 运算符的重载 在 kotlin 官网我们可以看到关于加法运算符的解释,如下所示。 image 我们定义一个类 Complex(复数),有两个属性real 实部,imagary虚部。 class Complex(var real: Double,...

ifjgm003的博客 469

Kotlin运算符重载及其他约定

重载算数运算符 下面以一个栗子开始,我们先定义一个Point data class Point(val x : Int, val y : Int) 下面给Point定义一些算术运算符.(在java中算术运算符只能用于基本数据类型,但是在kotlin中可以在任何类型下面使用) 定义一个plus运算符 data class Point(val x: Int, val y : Int){ ope...

weixin_34049948的博客 217

Kotlin运算符重载与约定

java中不支持运算符重载,而Kotlin支持操作符重载。这些操作符在Kotlin中是约定好的固定符号。(如:加号 + 乘号 * 等),和固定的优先级。而应用这样的操作符,我们也必须使用映射固定名字的成员函数或者扩展函数(加法 plus 乘法 times)。重载操作符的函数需要用operator修饰符来标记。 - 什么是运算符重载 运算符重载时对已有的运算符赋予新的含义,使一个运算符作用于不同类型...

Lud的博客 710

kotlin之重载运算符(十一)

一. 运算符重载概念 简单来说,就是Kotlin通过调用自己代码中定义特定的函数名的函数(成员函数或者扩展函数),并且用operator修饰符标记,来实现特定的语言结构 比如: // 一个简单的数据类 data class Foo(val x: Int, val y: Int) { operator fun plus(other: Foo) : Foo = Foo(x + other.x,...

heihei 543

Kotlin学习(十七): 运算符重载

在前面写了关于集合和范围的内容,里面包括了一点运算符重载的内容,在这里我们来详细了解运算符重载的知识,内容参考《Kotlin实战》(Kotlin in Action)。什么是运算符重载?简单来说,就是Kotlin通过调用自己代码中定义特定的函数名的函数(成员函数或者扩展函数),并且用operator修饰符标记,来实现特定的语言结构,例如如果你在一个类上面定义了一个特定函数命名plus的函数,那么按照

旺仔的专栏 934

kotlin 基本运算符和运算符重载

关键字 operater 1>任何类可以定义或者重载父类的基本运算符 2>通过运算符的函数名重载 3>对于参数个数的要求,对参数,返回值类型不作要求 运算符重载不能太随便 这点是java没有的,java的小伙伴羡慕嫉妒恨吧 package com.testOperaters /** * Created by jingwen on 19/4/14. * Kotlin 运...

android大牛MrJing 活动中心 554

Kotlin 运算符重载

Kotlin 运算符函数及其重载

Chanwing Chow的博客 720

Kotlin运算符重载

在本主题中,你将学习如何为自定义数据类型定义自己的运算符实现。运算符重载是 Kotlin 提供的一个强大工具,可以让你的代码更具可读性与表现力。你只需满足函数命名、修饰符和签名的基本要求,就能为你的类型添加直观且易用的运算符。

Hello World! 629

Kotlin-14-运算符重载(operator)

目录 1、定义 2、原理 3、作用 4、常用的运算符及对应的函数名 4.1一元运算符 4.2、二元运算符 4.3、复杂运算符 4.4、比较运算符 5、注意 1、定义 运算符重载就是对已有的运算符赋予他们新的含义。重载的修饰符是operator 比如我们的+号,它的含义是两个数值相加:1+1=2。+ 号对应的函数名是plus 然后对+号这个函数进行重载,可以让它可以实现...

Yo.o 8033

Kotlin学习 - 运算符重载

运算符在编译时会替换成方法的调用,比如+会替换成plus方法,Kotlin的每个运算符都有其对应的方法。在Kotlin中通过对运算符进行重载,允许任意两个对象进行相加,或者是进行更多其他的运算操作。上面例子就使用运算符重载实现了让两个Money对象相加的功能。3、当然对象还可以和数字相加,在上面基础上我们在加一个重载方法。

孔小乐的博客 805
上一篇: Kotlin - 基本数据类型
下一篇: 设计模式-外观模式
行云间
博客等级 码龄12年 438粉丝 173原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值