Koltin简明学习,操作符重载(Operator overloading)

Kotlin有个有趣的功能操作符重载(Operator overloading)。

先看一段程序:

val start = "Talk is cheap. "
val middle = "Show me the code. "
val end = "- android2me"

val result = start + middle + end
println(result)

输出结果:

Talk is cheap. Show me the code. - android2me

上面的例子我们发现这个加号(+)实现了字符串的连接。那么我们想想是这是怎么实现的。

我们点击加号,跳转到koltin的标准库的String文件中,光标停留在plus方法处。

下面是源代码:

package kotlin

/**
 * The `String` class represents character strings. All string literals in Kotlin programs, such as `"abc"`, are
 * implemented as instances of this class.
 */
public class String : Comparable<String>, CharSequence {
    companion object {}

    /**
     * Returns a string obtained by concatenating this string with the string representation of the given [other] object.
     */
    public operator fun plus(other: Any?): String

    public override val length: Int

    public override fun get(index: Int): Char

    public override fun subSequence(startIndex: Int, endIndex: Int): CharSequence

    public override fun compareTo(other: String): Int

}

从上面的分析看,加号(+)对应着plus这个方法。这个就是操作符重载,我们可以通过plus方法来定义“+”这个操作符。

常见的操作符和对应的方法名:

一元操作符(Unary Operators)

操作符方法名
+aa.unaryPlus()
-aa.unaryMinus()
!aa.not()
a++a.inc()

二元操作符(Binary Operators)

操作符方法名
a + ba.plus(b)
a – ba.minus(b)
a * ba.times(b)
a / ba.div(b)
a % ba.mod(b)
a..ba.rangeTo(b)
a in bb.contains(a)
a !in b!b.contains(a)
a += ba.plusAssign(b)
a -= ba.minusAssign(b)
a *= ba.timesAssign(b)
a /= ba.divAssign(b)
a %= ba.modAssign(b)

数值类型操作符(Array type operators)

操作符方法名
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)

等于和不等于操作符(Equals Operation)

操作符方法名
a == ba?.equals(b) ?: (b === null)
a != b!(a?.equals(b) ?: (b === null))

比较操作符(Comparison operators)

操作符方法名
a > ba.compareTo(b) > 0
a < ba.compareTo(b) < 0
a >= ba.compareTo(b) >= 0
a <= ba.compareTo(b) <= 0

调用操作符(Invoke operator)

操作符方法名
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)

举例

class Point(var x: Int, var y: Int) {

    operator fun unaryMinus(): Point {
        return Point(-x, -y)
    }

    override fun toString(): String {
        return "[$x, $y]"
    }
}

val point = Point(5, 8)
println(point)
println(-point)

打印输出:

I/System.out: [5, 8]
I/System.out: [-5, -8]

运用操作符重载给我们的开发带来了方便,但是要正确使用,防止产生歧义。

参考文献

https://kotlinlang.org/docs/reference/operator-overloading.html
https://antonioleiva.com/operator-overload-kotlin/
https://www.programiz.com/kotlin-programming/operators

Kotlin简明学习—文章列表

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值