KotlinのCompanion Objectに拡張関数をつける

このエントリーをはてなブックマークに追加

まず最初にKotlinで拡張関数を定義する方法

fun Any.f(){
   // do something
}

Companion Objectの参照方法

class A{
   companion object{
      fun a(){}
   }
}
A.a()
A.Companion.a()

このどちらでもイケる
これでJavaのstaticメソッドのようなことができる

そこで本題の拡張関数のつけかた

fun A.Companion.f(){}

直接Companionを参照するところが肝心だが定義したいクラスにCompanion Objectが定義されてる必要があることに注意

class B{}

fun B.Companion.f(){}//コンパイルエラー

それでわざわざこのような記事を書いたのはStringやLongなどのよく使うクラスにCompanion Objectの拡張関数をつけたかったからで…
結論:Companion Objectがなければできない

そういうことなので自分で対応するクラスを定義しなければならない

class StringC{
   companion object
}

class IntC{
   companion object
}

//こんな感じに定義する


//ちなみにinterfaceにもつけれるけど、さすがにこれは変態すぎでしょ
interface C{
   companion object
}