Page History

演算子のオーバーロードと規約

yhornisse edited this page on 26 Dec 2020

Clone this wiki locally

演算子のオーバーロードと規約

演算子のオーバーロード

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という名前でオーバーロードする。

  • a > b
  • a >= b
  • a < b
  • a <= b

compareTo()はIntを返す必要があり、 例えば「a >= b」は「a.compareTo(b) >= 0に変換される。

index演算子

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

オーバーロードされない

===(同一性演算子)はオーバーロードできない。

その他の規約

forループ