我们知道Java 中是不允许运算符重载的,1+1,输出肯定是2,kotlin 则可以重载。可见 kotlin 官网
'+' 运算符的重载
在 kotlin 官网我们可以看到关于加法运算符的解释,如下所示。
![](https://img.haomeiwen.com/i3171886/27d227b7edb542a8.jpg)
- 我们定义一个类 Complex(复数),有两个属性
real
实部,imagary
虚部。
class Complex(var real: Double, var imagnary: Double) {
//重载 + 号参数
operator fun plus(other: Complex): Complex {
return Complex(real + other.real, imagnary + other.imagnary)
}
//重载对参数和返回值没有要求,只要 operate 关键字+ 方法名相同,参数数量相同即可
operator fun plus(other: Int):Int{
return real.toInt()+other
}
//复写
override fun toString(): String {
return "$real+${imagnary}i"
}
}
//调用重载后方法
fun main(args: Array<String>) {
val a = Complex(1.0, 2.0)
val b = Complex(5.0, 7.9)
val c=10
println(a+b)
println (a+c)
- 重载对参数和返回值没有要求,只要 operate 关键字和方法名相同,参数数量相同即可。
再重载个‘()’invoke 方法
首先还是先看下官网中关于运算符()
的解释。
![](https://img.haomeiwen.com/i3171886/cdf4b4264c9b37f2.jpg)
- 重载()invoke 方法,我们把它重载为一个打印hellworld 的方法吧
class Complex(var real: Double, var imagnary: Double) {
//重载()invoke 方法,我们把它重载为一个打印hellworld 的方法把
operator fun invoke(){
println("hello world!!")
}
}
fun main(args: Array<String>) {
val a = Complex(1.0, 2.0)
a()
}
中缀表达式
另外由于中缀表达式可以定义像运算符一样的函数,所以这里顺带说下中缀表达式
- 在普通的一个只有一个参数的方法前面加一个infix 就是中缀表达式了。
- 我们在Desk 类中定一个一个on 方法,它接收一个参数(物体的名称),然后打印出该物体在桌子上。
class Desk{
//中缀表达式,普通的方法前面加个 infix 就是中缀表达式
infix fun On(name:String){
println("$name on the Desk!!")
}
}
fun main(args: Array<String>) {
val desk=Desk()
//中缀表达式的调用,可以省略 . 和 ()。不过这玩意有啥用呢?随便还是不要用的好,不容易阅读。
desk On "a lot of books"
}
- 调用的时候可以省略
. 和 ()
,除了看起来简洁,但会使得代码更难阅读,所以还是不要用的好。
总结
- 任意类可以定义或重载父类的基本运算符
- 通过运算符对应的具名函数来定义
- 参数的个数必须和运算符原来的具名函数相同,但对于参数和返回值的类型不做要求
- 可以重载的运算符有限,不像scalar 可以任意定义。
网友评论