Kotlinでは演算子をオーバーロードできる。 演算子をオーバーロードする場合、規約で決められたメソッド名でオーバーロードする。 分りやすい例としてはequalsである。 Kotlinではa == はa.equals(b)として扱われる。
それ以外のオーバーロードは以下のように行う。
>>> data class Hoge(var a:Int){}
>>> operator fun Hoge.times(b:Int) : Int = a * b
>>> Hoge(2) * 3
res2: kotlin.Int = 6
>>>
| 式 | 関数名 | 備考 |
|---|---|---|
| a == b | equals | |
| a * b | times | |
| a / b | div | |
| a % b | mod | |
| a + b | plus | |
| a - b | minus | |
| a << b | shl | |
| a >> b | shr | |
| a >>> b | ushr | |
| a & b | and | |
| a | b | or | |
| a ^ b | xor | |
| ~a | inv | |
| +a | unaryPlus | |
| -a | unaryMinus | |
| !a | not | |
| ++a, a++ | inc | |
| --a, a-- | dec | |
| a < b, a <= b, a > b, a >= b | compareTo | |
| a in b | b.contains(a) | forで使用するinはiteratorやhasNext、nextが使用される |
| a..b | rangeTo |
複合代入演算子はxxxAssignという感じの名前で定義する。
>>> data class Hoge(var a:Int) { }
>>> operator fun Hoge.timesAssign(b:Int) { this.a *= b }
>>> var v = Hoge(2)
>>> v *= 3
>>> v.a
res4: kotlin.Int = 6
>>>
以下はcompareToという名前でオーバーロードする。
compareTo()はIntを返す必要があり、 例えば「a >= b」は「a.compareTo(b) >= 0に変換される。
a[b]は以下のようにgetとsetという名前のメソッドでオーバーロードする。
>>> class Hoge() {}
>>> operator fun Hoge.get(idx:Int) : String = "hoge"
>>> var a = Hoge()
>>> a[1]
res9: kotlin.String = hoge
>>>
>>> operator fun Hoge.set(idx:Int, s:String) = println(s)
>>> a[1] = "hoge"
hoge
>>>
===(同一性演算子)はオーバーロードできない。