【Android】聊聊Kotlin操作符重载

算数运算操作符重载

在kotlin中我定义一个类

data class Point(val x: Int, val y: Int) 

然后实例化两个对象

val p1 = Point(3,5)
val p2 = Point(5,7) 

想表示p1的元素x加上p2的元素x,p1的元素y,加上p2的元素y.然后输出一个p3.

val p3 = Point(p1.x + p2.x, p2.y + p2.y) 

以上这种写法没有任何问题。不过我们可以利用Kotlin扩展函数简化上面的操作,我们给Point增加一个plus,并附加operator关键字。(增加operator的关键字是为了区分plus并不是一个普通的成员方法)

data class Point(val x: Int, val y: Int) {
   
    operator fun plus(other: Point): Point {
   
        return Point(x + other.x, y + other.y)
    }
} 

接下来再来实现上面的需求.

val p3 = p1 + p2 

这样表达起来更简洁了。 另外我们可以把plus作为Point的扩展方法

data class Point(val x: Int, val y: Int)

operator fun Point.plus(other: Point): Point {
   
    return Point(x + other.x, y + other.y)
} 

这种场景适用于Point存在于一个三方库,我们并能修改其中的内容. Kotlin中提供了以下操作符的重载. 只需要实现对应的方法即可。

【Android】聊聊Kotlin操作符重载_第1张图片

之前我们定一个了plus,参数是Point,实际上对于个操作符重载并不局限于同一种类型,接下来我们来定一个times,允许你去扩展Ponit.

data class Point(val x: Int, val y: Int)

operator fun Point.times(scale: Double): Point {
   
    return Point((x * scale).toInt(), (y * scale).toInt())
}

fun main(args: Array<String>) {
   
    val p = Point(10, 20)
    println(p * 1.5)
} 

注意kotlin不支持交换性,例如我这里写成1.5 * p这里是不允许的。除非你去定一个

operator fun Double.times(p: Point): Point 

返回类型同样也可以不是同一个类型,例如, 定义一个对char类型重载*操作符重复count后返回一个string.

operator fun Char.times(count: Int): String {
   
    return toString().repeat(count)
}

fun main(args: Array<String>) {
   
    

你可能感兴趣的:(Kotlin,android,kotlin)