インターフェースの実装(implement)とSAM変換(Kotlin)


注:Kotlin初心者です

Kotlin分かってる人からしたらそんなに難しい内容でも新しい内容でもないと思います。

動機

Sortや、java.utilのPriorityQueueのインスタンス化のときに、Comparatorを実装しようと思ったのが始まりです。この時、comparatorはInterfaceなので、何らか継承してクラスを作ってインスタンス化しなくてはいけません。方法をググっていると、stackoverflowにて1

Comparator<CustomObject> { a, b -> hoge}

のような書き方を見つけました。最初これはKotlinにおける無名オブジェクト宣言なのかなと思いましたが、無名オブジェクト宣言によるinterfaceの実装をする場合は

object: Comparator<CustomObject> {
    override fun compare(...){...}
}

のように書くため、無名オブジェクトではなさそうでした。この謎のInterfaceの実装方法について調べたんですが、意外と検索でヒットさせるのが難しかったです。(Kotlin Interface 実装とかだとなかなかすぐにはたどり着けなかった)
そこで、記憶のため及び初学者向けにまとめようと思った次第です。

結局なんだったの?

Functional (SAM) interfaces2 に対する SAM変換と呼ばれる記法でした。

これは、抽象メソッドが一つしかない (SAM:Single Abstract Method) Interfaceを実装するときに、上のような書き方でlambda式を使って抽象メソッドを実装したオブジェクトを生成できる (SAM変換) 書き方だそうです。無名オブジェクトを生成しても動きますが、この記法の方がスッキリするので良いです。

注意点としてはJavaで書かれたInterfaceにはほぼ確実に使えますが、Kotlinで書かれたインターフェースについては結構新しいバージョン(>=1.4)でないと使えないそうです3

以上