kotlin之重载运算符(十一)

本文介绍了Kotlin中的运算符重载概念,包括重载复合赋值运算符、一元运算符和比较运算符。重点讲解了如何重载等号运算符,使得可以使用`==`和`!=`来替代`equals`和`!equals`函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录


简单来说,就是Kotlin通过调用自己代码中定义特定的函数名的函数(成员函数或者扩展函数),并且用operator修饰符标记,来实现特定的语言结构

比如:

// 一个简单的数据类
data class Foo(val x: Int, val y: Int) {
    operator fun plus(other: Foo) : Foo = Foo(x + other.x, y + other.y)
}

fun main(args: Array<String>) {
    // 使用的时候
    val f1 = Foo(10, 20)
    val f2 = Foo(30, 40)
    // 直接用+运算符代替plus函数,事实上会调用plus函数
    println(f1 + f2) // 打印内容为Foo(x=40, y=60)
}

注意,如果Java要调用这一段代码,要像调用函数一样使用。

表达式函数名
a * btimes
a / bdiv
a % brem,mod(弃用)
a + bplus
a - bminus
表达式函数名
a += btimesAssign
a /= bdivAssign
a %= bremAssign
a += bplusAssign
a -= bminusAssign

如果在plus和plusAssign两个函数同时被定义且适用,那么编译器就会报错,最好在设计新类的时候保持(可变性)一致,尽量不同时定义plus和plusAssign运算。如Foo类是不可变的,那么只提供plus运算,如果一个类是可变的,如构造器,那么只需提供plusAssign和类似的运算就够了。

表达式函数名
+aunaryPlus
-aunaryMinus
!anot
++a, a++inc
–a, a–dec
表达式函数名
a == ba?.equals(b) ?: (b === null)
a != b!(a?.equals(b) ?: (b === null))
a > ba.compareTo(b) > 0
a < ba.compareTo(b) < 0
a >= ba.compareTo(b) >= 0
a <= ba.compareTo(b) <= 0

含有大于小于符号的比较运算符会被转换成compareTo函数,compareTo的返回类型必须为Int。

重载等号运算符

在我们平时使用判断字符串是否与某个字符串相等的时候,会使用equals函数来判断,然而在Kotlin中,我们可以是用==来代替equals函数,!=来代替!equals。

这是重载等号的一般用法:

data class Foo(val x: Int, val y: Int) {
    override operator fun equals(other: Any?): Boolean = when {
        // 使用恒等运算符来判断两个参数是否同一个对象的引用
        other === this -> true
        other !is Foo -> false
        else -> other.x == x && other.y == y
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值