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 >>>
===(同一性演算子)はオーバーロードできない。