天天看點

kotlin之重載運算符(十一)

目錄

  • 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
    }
}