kotlin中的运算符重载
#### [kotlin官方文档 https://www.kotlincn.net/docs/reference/](https://www.kotlincn.net/docs/reference/) ####
内容参考《Kotlin实战》
什么是运算符重载?
简单来说,就是 Kotlin
通过调用自己代码中定义特定的函数名的函数(成员函数或者扩展函数),并且用 operator
修饰符标记,来实现特定的语言结构,例如如果你在一个类上面定义了一个特定函数命名 plus
的函数,那么按照 Kotlin
的约定,可用在这个类的实例上使用 +
运算符,下面是代码。
用于重载运算符的所有函数都必须使用
operator
关键字标记。
data class Foo(val x: Int, val y: Int) {
operator fun plus(instance: Foo) = Foo(x + instance.x, y + instance.y)
override fun toString(): String {
return "$x + ${y}i"
}
}
fun main(args: Array<String>) {
var aFoo = Foo(2, 5)
var otherFoo = Foo(4, 5)
println(aFoo + otherFoo)
// 6 + 10i
}
那么Java如何调用运算符函数呢?
重载的运算符实际上是被定义成一个函数,Java调用Kotlin运算符就跟调用普通函数一样调用就行。
重载算术运算符
算术运算符包括二元运算符、复合赋值运算符、一元运算符,当 Kotlin
在给一个集合添加元素的时候,是调用 add
方法,用到重载的话,我们就可以直接用 +=
来进行这个操作,就会显得更加的优雅。。。
//为类增加扩展函数
fun Any.println() = println(this)
fun main(args: Array<String>) {
val list = arrayListOf<String>()
list.add("a")
list.println()
//[user, admin, a]
list += "zbc"
//[user, admin,a, zbc]
list.println()
}
重载二元算术运算符
二元算术运算符就是常见的 +、-、*、/
和取余 %
,优先级与数学的是一样的,*、/
和 %
要高于 +、-
的优先级。
下面我们列举对应的函数名:
表达式 | 函数名 |
---|---|
a * b | times |
a / b | div |
a % b | rem,mod(弃用) |
a + b | plus |
a - b | minus |
下面我们来写个类,里面包含这几种函数,同时还有扩展函数的定义。
data class Foo(val x: Int, val y: Int) {
operator fun plus(instance: Foo) = Foo(x + instance.x, y + instance.y)
operator fun div(instance: Foo) = Foo(x / instance.x, y / instance.y)
operator fun times(instance: Foo) = Foo(x * instance.x, y * instance.y)
operator fun rem(instance: Foo) = Foo(x % instance.x, y % instance.y)
operator fun minus(instance: Foo) = Foo(x - instance.x, y - instance.y)
override fu