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で解決できるとも書いてあるが未検証:(