次のコードは、RxJavaの例をKotlinに変換しようとしています。 MutableList
にInt
の束を集めることになっていますが、いくつかのエラーが発生します。RxKotlin collectInto()メソッドリファレンスを使用するMutableList
val all: Single<MutableList<Int>> = Observable
.range(10, 20)
.collectInto(::MutableList, MutableList::add)
エラー:
Error:(113, 36) Kotlin: Type inference failed: Not enough information to infer parameter T in inline fun <T> MutableList(size: Int, init: (index: Int) -> T): MutableList<T>
Please specify it explicitly.
Error:(113, 49) Kotlin: One type argument expected for interface MutableList<E> : List<E>, MutableCollection<E> defined in kotlin.collections
Error:(113, 67) Kotlin: None of the following functions can be called with the arguments supplied:
public abstract fun add(element: Int): Boolean defined in kotlin.collections.MutableList
public abstract fun add(index: Int, element: Int): Unit defined in kotlin.collections.MutableList
ImmutableList::add
ImmutableList<Int>::add
に、私が交換され、エラーが期待type引数、取り除く私が変更した場合:これはストレートで
Error:(113, 22) Kotlin: Type inference failed: fun <U : Any!> collectInto(initialValue: U!, collector: ((U!, Int!) -> Unit)!): Single<U!>!
cannot be applied to
(<unknown>,<unknown>)
Javaの次のコピー:
最初のエラーは間違ったタイプを推測していることを示していますが、私はより明示的に(どこで?)必要があることを理解していますが、::MutableList
は() -> MutableList<Int>
と同等と考えていました。 3つ目のエラーは、引数を使ってadd()
メソッドのいずれも呼び出せないことを伝えていますが、やはりMutableList::add
は{ list, value -> list.add(value) }
に相当します。 4番目のエラーは、collector
に適用されているタイプがわからないことを示しています。
私が代わりにラムダ式を使用する場合は、エラーがない:
val all: Single<MutableList<Int>> = Observable
.range(10, 20)
.collectInto(mutableListOf(), { list, value -> list.add(value) })
all.subscribe { x -> println(x) }
私が誤解してきた何かが明確にありますように私は、私はメソッド参照と間違ってやってるかについていくつかのコメントをいただければと思います(Kotlin Language Referenceを見て、私はそれがこの時点で言語機能であるのだろうかと思っています)。とても有難い。
あなたはlambdasで同じエラーを受け取っていませんか?私はそれを得るので... – Lovis