操作符重载
在Kotlin中,操作符重载(Operator Overloading)允许你为类定义或修改运算符的行为。通过定义特定的函数,你可以自定义一些常见的运算符(如 +, -, *, / 等)的行为。Kotlin使用operator关键字来标记这些函数,以表明它们是用于操作符重载的。
1. 操作符重载的规则:
- 只能重载Kotlin预定义的操作符。
- 必须使用特定的函数名称,这些名称与操作符关联。
2. 操作符重载的语法:
kotlin
operator fun operatorFunctionName(parameter: Type): ReturnType3. 常见操作符及其重载函数:
加法 (
+)kotlindata class Point(val x: Int, val y: Int) operator fun Point.plus(other: Point): Point { return Point(this.x + other.x, this.y + other.y) } fun main() { val p1 = Point(1, 2) val p2 = Point(3, 4) val result = p1 + p2 println(result) // 输出:Point(x=4, y=6) }减法 (
-)kotlinoperator fun Point.minus(other: Point): Point { return Point(this.x - other.x, this.y - other.y) } fun main() { val p1 = Point(5, 6) val p2 = Point(2, 3) val result = p1 - p2 println(result) // 输出:Point(x=3, y=3) }乘法 (
*)kotlinoperator fun Point.times(scale: Int): Point { return Point(this.x * scale, this.y * scale) } fun main() { val p = Point(2, 3) val result = p * 3 println(result) // 输出:Point(x=6, y=9) }除法 (
/)kotlinoperator fun Point.div(scale: Int): Point { return Point(this.x / scale, this.y / scale) } fun main() { val p = Point(6, 9) val result = p / 3 println(result) // 输出:Point(x=2, y=3) }取负号 (
unaryMinus)kotlinoperator fun Point.unaryMinus(): Point { return Point(-this.x, -this.y) } fun main() { val p = Point(3, 4) val result = -p println(result) // 输出:Point(x=-3, y=-4) }比较操作符 (
<,<=,>,>=) 这些操作符通常用于比较对象的大小,比如compareTo方法:kotlindata class Rectangle(val width: Int, val height: Int) operator fun Rectangle.compareTo(other: Rectangle): Int { return (this.width * this.height) - (other.width * other.height) } fun main() { val r1 = Rectangle(2, 3) val r2 = Rectangle(3, 4) println(r1 < r2) // 输出:true }索引访问 (
[]) 如果希望重载索引访问,可以重载get和set函数:kotlinclass Matrix(private val data: Array<IntArray>) { operator fun get(i: Int, j: Int): Int { return data[i][j] } operator fun set(i: Int, j: Int, value: Int) { data[i][j] = value } } fun main() { val matrix = Matrix(arrayOf(intArrayOf(1, 2), intArrayOf(3, 4))) println(matrix[0, 1]) // 输出:2 matrix[0, 1] = 5 println(matrix[0, 1]) // 输出:5 }
4. 其他可重载的操作符:
++/--:inc()和dec()- 相等性检查 (
==和!=):equals() - 比较 (
<,<=,>,>=):compareTo() - 取模 (
%):rem() - 取反 (
!):not()
通过操作符重载,Kotlin允许你定义更加直观且符合自然语言逻辑的操作,使得你的类更易于使用。
