目錄
- 1. 運算符重載概念
- 2. 重載運算符類型
- 3. 重載複合指派運算符
- 4. 重載一進制運算符
- 5. 重載比較運算符
1. 運算符重載概念
簡單來說,就是Kotlin通過調用自己代碼中定義特定的函數名的函數(成員函數或者擴充函數),并且用operator修飾符标記,來實作特定的語言結構
比如:
// 一個簡單的資料類
data class Foo(val x: Int, val y: Int) {
operator fun plus(other: Foo) : Foo = Foo(x + other.x, y + other.y)
}
fun main(args: Array<String>) {
// 使用的時候
val f1 = Foo(10, 20)
val f2 = Foo(30, 40)
// 直接用+運算符代替plus函數,事實上會調用plus函數
println(f1 + f2) // 列印内容為Foo(x=40, y=60)
}
注意,如果Java要調用這一段代碼,要像調用函數一樣使用。
2. 重載運算符類型
表達式 | 函數名 |
---|---|
a * b | times |
a / b | div |
a % b | rem,mod(棄用) |
a + b | plus |
a - b | minus |
3. 重載複合指派運算符
表達式 | 函數名 |
---|---|
a += b | timesAssign |
a /= b | divAssign |
a %= b | remAssign |
a += b | plusAssign |
a -= b | minusAssign |
如果在plus和plusAssign兩個函數同時被定義且适用,那麼編譯器就會報錯,最好在設計新類的時候保持(可變性)一緻,盡量不同時定義plus和plusAssign運算。如Foo類是不可變的,那麼隻提供plus運算,如果一個類是可變的,如構造器,那麼隻需提供plusAssign和類似的運算就夠了。
4. 重載一進制運算符
表達式 | 函數名 |
---|---|
+a | unaryPlus |
-a | unaryMinus |
!a | not |
++a, a++ | inc |
–a, a– | dec |
5. 重載比較運算符念
表達式 | 函數名 |
---|---|
a == b | a?.equals(b) ?: (b === null) |
a != b | !(a?.equals(b) ?: (b === null)) |
a > b | a.compareTo(b) > 0 |
a < b | a.compareTo(b) < 0 |
a >= b | a.compareTo(b) >= 0 |
a <= b | a.compareTo(b) <= 0 |
含有大于小于符号的比較運算符會被轉換成compareTo函數,compareTo的傳回類型必須為Int。
重載等号運算符
在我們平時使用判斷字元串是否與某個字元串相等的時候,會使用equals函數來判斷,然而在Kotlin中,我們可以是用==來代替equals函數,!=來代替!equals。
這是重載等号的一般用法:
data class Foo(val x: Int, val y: Int) {
override operator fun equals(other: Any?): Boolean = when {
// 使用恒等運算符來判斷兩個參數是否同一個對象的引用
other === this -> true
other !is Foo -> false
else -> other.x == x && other.y == y
}
}