前言
更全更新的内容可以参考 Kotlin语言中文站。[操作符重载 - Kotlin 语言中文站 (kotlincn.net)]:
Kotlin针对我们创建的函数和扩展函数,提供了一种固定符号标记功能。
我们可以直接通过标记符号调用函数,而不用通过函数名调用。
支持操作符调用的函数,必须使用 operator修饰符
同时,Kotlin针对不同的操作符定义了一套现行规范。
定义名称为: 操作符重载
(ps:不同的Kotlin版本可能会出现不同。)
一元操作符
只有一个对象参与
表达式 | 函数式 |
---|---|
+a | a.unaryPlus() |
-a | a.unaryMinus() |
!a | a.not() |
a++ | a.inc() |
a-- | a.dec() |
实例:
class Test1 {
operator fun unaryPlus() {
println("一元操作符")
}
}
fun main(array: Array<String>) {
var ss = Test1()
+ss
}
//输出 : 一元操作符
二元操作符
两个对象参与。 在表达式左边的对象才需要实现函数式里面的函数。
表达式 | 函数式 |
---|---|
a + b | a.plus(b) |
a - b | a.minus(b) |
a * b | a.times(b) |
a / b | a.div(b) |
a % b | a.rem(b) |
a..b | a.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 b | b.contains(a) |
a !in b | b.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] = b | a.set(i, b) |
a[i, j] = b | a.set(i, j, b) |
a[i_1, ……, i_n] = b | a.set(i_1, ……, i_n, b) |
方括号的转换都指向了get
和set
方法
调用操作符
表达式 | 函数式 |
---|---|
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 += b | a.plusAssign(b) |
a -= b | a.minusAssign(b) |
a *= b | a.timesAssign(b) |
a /= b | a.divAssign(b) |
a %= b | a.remAssign(b) |
等号操作符
表达式 | 函数式 |
---|---|
a == b | a?.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 > b | a.compareTo(b) > 0 |
a < b | a.compareTo(b) < 0 |
a >= b | a.compareTo(b) >= 0 |
a <= b | a.compareTo(b) <= 0 |
注意
使用操作符定义的函数必须使用operator
关键字。
我们如果定义使用了operator关键字,那么函数名就必须命名上面表格定义的函数名了。
否则会提示:'operator' modifier is inapplicable on this function: illegal function name
修饰符不适用于此函数:非法函数名。
评论区