RxJava convert to Kotlin/SAM conversion

RxJavaのコードを含むJava codeをKotlinにconvertしようとした時のメモ。SAM conversionができない例/その対処法など。

事象

Single.zip<Response1, Response2, Response3, OutputObject>(
                     getResponse1(),
                     getResponse2(),
                     getResponse3(),
                     Function3<Response1, Response2, Response3, OutputObject> { response1, response2, response3 ->
                         OutputObject(
                             response1,
                             response2,
                             response3
                         )
                     }
                 )

例えば上のようなJavaのコードをKotlinにconvertするとFunction3の部分で以下のようなエラーが出る。

Cannot infer a type for this parameter. Please specify it explicitly.`

object: Function3{} の形で試してみても Type Mismatch のエラーで解決せず。

解決法

typealiasを使ってFunction3に代わるものを宣言して解決。

typealias RxFunction3<T1, T2, T3, R> = io.reactivex.functions.Function3<T1, T2, T3, R>

Fuction3の代わりに上で宣言したRxFunction3を使う。

Single.zip<Response1, Response2, Response3, OutputObject>(
                     getResponse1(),
                     getResponse2(),
                     getResponse3(),
                     RxFunction3<Response1, Response2, Response3, OutputObject> { response1, response2, response3 ->
                         OutputObject(
                             response1,
                             response2,
                             response3
                         )
                     }
                 )

ref: stackoverflow.com

この状況が起きるのはStackOverflowにもあるようにoverloadされているメソッドで第3parameterにどの型がくるのか判別できずに起きている模様。 RxKotlinで解決できるとも書いてあるが未検証:(