在 Kotlin 中,尽管可以重载许多运算符,但并不是所有运算符都可以重载,而且某些运算符重载的适用性依赖于上下文。以下是一个类的代码示例,展示了 Kotlin 中可重载的运算符。
data class CustomNumber(val value: Int) : Comparable<CustomNumber> {
// 重载加法运算符 (+)
operator fun plus(other: CustomNumber): CustomNumber {
return CustomNumber(this.value + other.value)
}
// 重载减法运算符 (-)
operator fun minus(other: CustomNumber): CustomNumber {
return CustomNumber(this.value - other.value)
}
// 重载乘法运算符 (*)
operator fun times(other: CustomNumber): CustomNumber {
return CustomNumber(this.value * other.value)
}
// 重载除法运算符 (/)
operator fun div(other: CustomNumber): CustomNumber {
return CustomNumber(this.value / other.value)
}
// 重载取余运算符 (%)
operator fun rem(other: CustomNumber): CustomNumber {
return CustomNumber(this.value % other.value)
}
// 重载取反运算符 (-)
operator fun unaryMinus(): CustomNumber {
return CustomNumber(-this.value)
}
// 重载递增运算符 (++)
operator fun inc(): CustomNumber {
return CustomNumber(this.value + 1)
}
// 重载递减运算符 (--)
operator fun dec(): CustomNumber {
return CustomNumber(this.value - 1)
}
// 重载相等运算符 (==)
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (other !is CustomNumber) return false
return value == other.value
}
// 重载比较运算符 (<, >, <=, >=)
override fun compareTo(other: CustomNumber): Int {
return this.value.compareTo(other.value)
}
// 重载 in 运算符
operator fun contains(other: CustomNumber): Boolean {
return this.value == other.value
}
// 重载 [] 运算符 (模拟数组访问)
operator fun get(index: Int): Int {
return value + index
}
// 重载 invoke 运算符 (让对象像函数一样调用)
operator fun invoke(): Int {
return value * 2
}
// 重载位运算符 (shl 左移, shr 右移, and 与, or 或, xor 异或)
operator fun shl(bits: Int): CustomNumber {
return CustomNumber(this.value shl bits)
}
operator fun shr(bits: Int): CustomNumber {
return CustomNumber(this.value shr bits)
}
operator fun and(other: CustomNumber): CustomNumber {
return CustomNumber(this.value and other.value)
}
operator fun or(other: CustomNumber): CustomNumber {
return CustomNumber(this.value or other.value)
}
operator fun xor(other: CustomNumber): CustomNumber {
return CustomNumber(this.value xor other.value)
}
// 重载取反运算符 (~)
operator fun not(): CustomNumber {
return CustomNumber(this.value.inv())
}
}
fun main() {
val num1 = CustomNumber(10)
val num2 = CustomNumber(5)
// 测试重载的运算符
println("num1 + num2 = {num1 + num2}")
println("num1 - num2 = {num1 - num2}")
println("num1 * num2 = {num1 * num2}")
println("num1 / num2 = {num1 / num2}")
println("num1 % num2 = {num1 % num2}")
println("Unary -num1 = {-num1}")
println("num1++ = {num1++}")
println("num2-- = {num2--}")
println("num1 == num2 = {num1 == num2}")
println("num1 < num2 = {num1 < num2}")
println("num1 > num2 = {num1 > num2}")
println("num1 contains num2 = {num1 in num2}")
println("num1[2] = {num1[2]}")
println("num1() = {num1()}")
println("num1 shl 2 = {num1 shl 2}")
println("num1 shr 2 = {num1 shr 2}")
println("num1 and num2 = {num1 and num2}")
println("num1 or num2 = {num1 or num2}")
println("num1 xor num2 = {num1 xor num2}")
println("not num1 = {!num1}")
}
说明
- 加法、减法、乘法、除法、取余:通过 plus、minus、times、div、rem 方法重载。
- 取反:通过 unaryMinus 方法重载。
- 递增、递减:通过 inc 和 dec 方法重载。
- 相等比较:通过 equals 方法重载。
- 大小比较:通过 compareTo 方法重载。
- in 运算符:通过 contains 方法重载。
- 下标运算符:通过 get 方法重载。
- 函数调用:通过 invoke 方法重载。
- 位运算符:通过 shl(左移)、shr(右移)、and(与)、or(或)、xor(异或)重载。
- 取反(按位):通过 not 方法重载。