一、二元运算符的重载
1、常见的运算符有:加、减、乘、除、求余;我们要重载这些运算符的操作
这里以加法重载运算符为例
data class Point(val x: Int, val y: Int) { operator fun plus(other: Point): Point { return Point(x + other.x, y + other.y) } }
如上在Point类中增加了operator标记,表示该函数是重载了plus; 重载了plus之后就能执行两个Point的相加: val point3 = point1 + point2
val p1 = Point(10, 20) val p2 = Point(20, 30) println(p1 + p2) // Point(x=30, y=50)
为何这里重载了plus之后就可以执行两个Point的相加? 其实这个是kotlin的约定
如下是加、减、乘、除、求余各个表达式对应的重载运算符
这里的运算符跟咱们平时使用的运算符加减乘除一样有优先级,如下:
data class Point(val x: Int, val y: Int) { operator fun plus(other: Point): Point { return Point(x + other.x, y + other.y) } operator fun times(other: Point): Point { return Point(x * other.x, y * other.y) } } val p1 = Point(10, 20) val p2 = Point(20, 30) val p3 = Point(2, 3) println(p1 + p2 * p3) // Point(x=50, y=110)
也可以在类外面定义即把它定义为扩展函数
operator fun Point.minus(other: Point): Point { return Point(x - other.x, y - other.y) } val p1 = Point(10, 20) val p2 = Point(20, 30) println(p1 - p2)
2、关于上述的运算符对应的 +=、-=。。。。。
这里以加为例子,对应的运算符重载可以是plus 也可以是plusAsign
但是plus对应的方式是返回对象的赋值,plusAsign对应的方式是内部对象的赋值
data class Point(var x: Int, var y: Int) { operator fun plus(other: Point): Point { // 这里以返回对象的方式 return Point(x + other.x, y + other.y) } operator fun plusAssign(other: Point) { // 这里以改变内部参数值的方式 this.x += x this.y += y } }
如下是调用方式
var p1 = Point(10, 20) val p2 = Point(20, 30) p1 += p2 // 这里会报错,因为p1是var的方式,那么上述的两个重载都是能够调用 // 对应的解决方案是:让p1为val的类型 val p1 = Point(10, 20) val p2 = Point(20, 30) p1 += p2 // 这里调用的会是plusAssign,在p1的内部修改x和y;因为p1是val的方式则不允许用结果返回的方式重新给p1赋值
如下是 a+=b 的调用逻辑
二、重载一元运算符
1、跟二元运算符类似,如下是一元运算符表达式对应的函数名
这里有疑问的应该就前加和后加,其实从上述的前加和后加都调用同一个函数inc
operator fun BigDecimal.inc() = this + BigDecimal.TEN // 一个自加,加10 var bd = BigDecimal.ZERO println(bd++) // 0 println(++bd) // 20
如上是前自加和后自加,跟咱们平时返回的一致
三、重载比较运算符
1、等号运算符:equals
具体的判断方式为
a == b => a?.equals(b) ?: (b == null)
如果a为空则判断b是否为空
注意:这里的equals不能被重载为扩展函数,因为这个equals是定义在any中,类中的函数始终优先于扩展函数。所以即使重载为扩展函数也是不会被调用到。
2、排序运算符: compareTo
实现接口Comparable对应的函数compareTo
a.compareTo(b)
如果a大于b则返回大于0的数,如果a等于b则返回0,如果a小于b则返回小于0的数
class Person(val firstName: String, val lastName: String): Comparable<Person> { override fun compareTo(other: Person): Int { return compareValuesBy(this, other, Person::firstName, Person::lastName) // 这里传入的参数是按照顺序,比较的参数也是按照顺序 } }
标签:p1,val,Point,kotlin,运算符,other,重载 From: https://www.cnblogs.com/czwlinux/p/17811390.html