侧边栏壁纸
博主头像
Z同学博主等级

工作磨平激情前,坚持技术的热忱。 欢迎光临Z同学的技术小站。 分享最新的互联网知识。

  • 累计撰写 274 篇文章
  • 累计创建 55 个标签
  • 累计收到 74 条评论

Kotlin之中的操作符

Z同学
2021-07-20 / 0 评论 / 1 点赞 / 528 阅读 / 1,871 字
温馨提示:
本文最后更新于 2021-11-18,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

前言

更全更新的内容可以参考 Kotlin语言中文站。[操作符重载 - Kotlin 语言中文站 (kotlincn.net)]:

Kotlin针对我们创建的函数和扩展函数,提供了一种固定符号标记功能。

我们可以直接通过标记符号调用函数,而不用通过函数名调用。

支持操作符调用的函数,必须使用 operator修饰符

同时,Kotlin针对不同的操作符定义了一套现行规范。

定义名称为: 操作符重载

(ps:不同的Kotlin版本可能会出现不同。)

一元操作符

只有一个对象参与

表达式函数式
+aa.unaryPlus()
-aa.unaryMinus()
!aa.not()
a++a.inc()
a--a.dec()

实例:

class Test1 {
    operator fun unaryPlus() {
        println("一元操作符")
    }

}

fun main(array: Array<String>) {
    var ss = Test1()
    +ss
}
//输出 : 一元操作符

二元操作符

两个对象参与。 在表达式左边的对象才需要实现函数式里面的函数。

表达式函数式
a + ba.plus(b)
a - ba.minus(b)
a * ba.times(b)
a / ba.div(b)
a % ba.rem(b)
a..ba.rangeTo(b)

实例1:

class Test1 {
    operator fun unaryPlus() {
        println("一元操作符")
    }

    operator fun rem(tt: Test2) {
    }
}
class Test2{

}

fun main(array: Array<String>) {
    var ss = Test1()
    var tt = Test2()
    //哪个类在左边,哪个类就实现上面的函数
    ss % tt
}

in操作符

这个操作符刚好相反,在右边的参数实现函数

表达式函数式
a in bb.contains(a)
a !in bb.contains(a)

这两个方法都是一个函数式,只是函数式返回的boolean 根据 “!”取相反

实例1:

class Test1
class Test2 {
    operator fun contains(ss: Test1): Boolean {
        return false
    }
}

fun main(array: Array<String>) {
    var ss = Test1()
    var tt = Test2()
    ss !in tt
    ss in tt
}

索引访问操作符

表达式函数式
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, ……, i_n, b)

方括号的转换都指向了getset方法

调用操作符

表达式函数式
a()a.invoke()
a(i)a.invoke(i)
a(i, j)a.invoke(i, j)
a(i_1, ……, i_n)a.invoke(i_1, ……, i_n)

圆括号的转换都指向了invaoke方法

广义赋值

表达式函数式
a += ba.plusAssign(b)
a -= ba.minusAssign(b)
a *= ba.timesAssign(b)
a /= ba.divAssign(b)
a %= ba.remAssign(b)

等号操作符

表达式函数式
a == ba?.equals(b) ?: (b === null)
a != b!(a?.equals(b) ?: (b === null))

其实默认情况下,两个类都有从Any继承来的equals函数

var str1 = "ssss"
var str2 = "ssss"
println(str1 == str2)
//输出  true

在Kotlin之中 String也可以直接使用等号。

比较操作符

表达式函数式
a > ba.compareTo(b) > 0
a < ba.compareTo(b) < 0
a >= ba.compareTo(b) >= 0
a <= ba.compareTo(b) <= 0

注意

使用操作符定义的函数必须使用operator关键字。

我们如果定义使用了operator关键字,那么函数名就必须命名上面表格定义的函数名了。

否则会提示:'operator' modifier is inapplicable on this function: illegal function name 修饰符不适用于此函数:非法函数名。

1

评论区