在 Kotlin
中允许对操作符进行重载,并提供了简单友好的方式来支持这个特性,这样的好处就是我们可以对一些原本不支持操作符的类型使用操作符,简化代码,举个例子,Kotlin
中的集合类型是支持操作符的,而 Java
中不支持,对比一下使用和不使用操作符对集合增减元素的操作。
1 | // 使用操作符 |
操作符重载的基本原理就是每种操作符都有其对应的函数名,这是一一对应的,当对某个类型的对象使用操作符时,编译器便会查找该类型下,是否存在该名称的函数,并使用 operator
关键字标记,可以是成员函数也可以是扩展函数,如果有的话,匹配相应的参数,调用该函数。
操作符函数一览表
操作符 | 函数 | 描述 |
---|---|---|
+a | unaryPlus() | |
-a | unaryMinus() | |
!a | not() | |
a++/++a | inc() | |
a- -/- -a | dec() | |
a+b | plus(b) | |
a-b | minus(b) | |
a*b | times(b) | |
a/b | div(b) | |
a%b | rem(b) | |
a+=b | plusAssign(b) | 不能有返回值 |
a-=b | minusAssign(b) | 不能有返回值 |
a*=b | timesAssign(b) | 不能有返回值 |
a/=b | divAssign(b) | 不能有返回值 |
a%=b | remAssign(b) | 不能有返回值 |
a[i][j] | get(i,j) | |
a[i][j=b] | set(i,j,b) | 至少有一个参数为b |
a(p) | invoke(p) | |
a..b | rangeTo(b) | |
b in a | contains(b) | |
a==b | equals(b) | |
a>b | compareTo(b) |
一元操作符
主要包括 +a,-a,!a,a++,a--,++a,--a
等一元操作符运算。
1 | class MyData(var myName: String, var myAge: Int):Comparable<MyData> { |
调用
1 | var data = MyData("chendong", 11) |
四则运算与模运算
这类运算符使得任何类型的对象都可以进行 + - * / %
的运算,当然这些运算的具体实现细节是由我们自己实现的。
1 | class MyData(var myName: String, var myAge: Int):Comparable<MyData> { |
调用
1 | var data = MyData("chendong", 11) |
下标访问
这类匀速符使对象可以如同数组一样使用 a[i][j]..
的形式访问。
1 | class MyData(var myName: String, var myAge: Int):Comparable<MyData> { |
调用
1 | var data = MyData("chendong", 11) |
函数调用
这个操作符使得我们可以像函数一样直接使用对象后面添加括号,如 a()
来调用这个对象的 invike()
函数。
1 | class MyData(var myName: String, var myAge: Int):Comparable<MyData> { |
调用
1 | var data = MyData("chendong", 11) |
其他操作符
使用 ..
操作符
1 | // a .. b |
使用 in
操作符
1 | // b in a |
使用 ==
操作符
1 | override fun equals(other: Any?): Boolean { |
使用 <,>,<=,>=
操作符
1 | override fun compareTo(other: MyData): Int { |
调用
1 | var data = MyData("chendong", 11) |