Kotlin 操作符重载

Kotlin 操作符重载

Kotlin 通过 operator 关键字 修饰 操作符函数,来实现 操作符重载。
++ 操作,对应 inc 函数,-- 操作符,对应 dec 函数

举例,Point 类 实现 ++ 操作符重载:

kotlin 复制代码
class Point {
    operator fun inc(): Point {
        // 实现 ++ 重载
        return Point(x+1, y+1)
    }
}

说明:对象 遇到 操作符时,即调用 对应的 操作符函数。

操作符函数 根据 操作符 分类:

一元操作符

操作符 重载函数名
a++ a.inc()
a-- a.dec()
!a a.not()
+a a.unaryPlus()
-a a.unaryMinus()

数学运算符

操作符 重载函数名
a+b a.plus(b)
a-b a.mius(b)
a*b a.times(b)
a / b a.div(b)
a...b a.rangeTo(b)
a...<b a.rangeUtil(b)

相等操作符

操作符 重载函数名
a == b a?.equals(b) ?: (b === null)
a != b !(a?.equals(b) ?: (b === null)),即 相等的 取反

比较操作符

实现了 Comparable 接口的 compareTo 方法,通过 其返回值比较。

操作符 重载函数名
a > b a.compareTo(b) > 0
a < b a.compareTo(b) < 0
a >= b a.compareTo(b) >= 0
a <= b a.compareTo(b) <= 0

in 操作符

操作符 重载函数名
a in b a.contains(b)
a !in b !a.contains(b)

索引 操作符

操作符 重载函数名
a[i] a.get(i)
a[i] = b a.set(i, b)

invoke调用操作符

Kotlin 实现 可调用函数,基于
kotlin.jvm.functions.Function1 - 22...N

1 - 22 对应是 形参的个数,N 时 用 vararg 可变参数

实现了 invoke 操作符重载方法。

Kotlin 复制代码
operator fun invoke(p1: P1): R
操作符 重载函数名
a() a.invoke()
a(i) a.invoke(i)

属性委托操作符

在 属性委托 中,实现了 getValuesetValue 方法,实现 委托属性的 读写。

方法 添加了 operator 修饰,即 委托操作符的重载。

示例代码

++ -- 重载

kotlin 复制代码
data class Point(var x: Int = 0, var y: Int = 0) {

    operator fun inc(): Point {
        return Point(this.x + 1, this.y + 1);
    }

    operator fun dec(): Point {
        return Point(this.x - 1, this.y - 1);
    }

}

fun main(args: Array<String>) {
    var pt = Point(0, 0)
    pt++
    pt--
    pt--
    println("pt: $pt")
}

// 输出结果 
pt: Point(x=-1, y=-1)

文档

相关推荐
lly2024064 分钟前
Pandas CSV:数据处理的强大工具
开发语言
少司府4 分钟前
C++基础入门:内存管理
c语言·开发语言·c++·内存管理·delete·new·malloc
鱼很腾apoc8 分钟前
【学习篇】第17期 C++入门必看——类和对象全站最详篇
c语言·开发语言·学习·算法·青少年编程
Sakuyu434689 分钟前
C语言基础(一)
c语言·开发语言
Grackers10 分钟前
Android Perfetto 系列 10:Binder 调度与锁竞争
android·binder
码农的神经元14 分钟前
2026 MathorCup C 题实战复盘:从高血脂风险预警到 6 个月干预优化的建模思路与 Python 落地
c语言·开发语言·python
人道领域23 分钟前
【黑马点评日记03】实战:Redis缓存穿透,缓存击穿,缓存雪崩全解析
java·开发语言·jvm·redis·spring·tomcat
李白你好29 分钟前
Android 自动化渗透测试指令生成
android·自动化
阿拉金alakin32 分钟前
深入理解 Java 线程池:核心参数、工作流程与常用创建方式
java·开发语言·java-ee
slandarer1 小时前
MATLAB | R2026a 更新了哪些有趣的新东西?
开发语言·数据库·matlab