以前はRxJavaとKotlinを使っていくつかの問題を抱えていました。私はまだ私が困惑しているいくつかの興味深い発見をしました。Kotlinの高次関数とシングルメソッドのインタフェースでの動作は?
私はRxJavaクラスも、Observable
に拡張メソッドを追加しようとしていたRxJava
public interface Func1<T, R> extends Function {
R call(T t);
}
でシンプルなFunc1
インタフェースがあります。これは、Func1
を使用してGoogle Guava ImmutableListMulitmap
に排出量を収集し、各項目からキーをマップします。
fun <K,T> Observable<T>.toImmutableListMultimap(keyMapper: Func1<T, K>): Observable<ImmutableListMultimap<K,T>> {
return this.collect({ ImmutableListMultimap.builder<K,T>()},{ b, t -> b.put(keyMapper.call(t), t)}).map { it.build() }
}
私はこの拡張メソッドを呼び出そうとしましたが、コンパイルできず、ラムダ式を全く理解できませんでした。私はfunction typeを使用するための拡張メソッドを変更したとき
ScheduledItem.all.flatMap { it.rebuildSoftTransactions }
.toImmutableListMultimap { it.id /*compile error */ } .cache()
しかし、奇妙なことが起こりました。
fun <K,T> Observable<T>.toImmutableListMultimap(keyMapper: (T) -> K): Observable<ImmutableListMultimap<K,T>> {
return this.collect({ ImmutableListMultimap.builder<K,T>()},{ b, t -> b.put(keyMapper(t), t)}).map { it.build() }
}
そしてすべてがうまくコンパイルされました。しかし、これが私に困惑しています:どのようにしてラムダをインターフェイスに推論していないのですか? Observable
の標準map()
メソッドを使用すると、ラムダを中括弧{ }
の構文を使用してうまく推定します。しかし、なぜ私の上記の拡張メソッドではうまくいかないのですか?