以下代码是我尝试将RxJava示例转换为Kotlin。它应该收集一堆Int
的成MutableList
,但我得到了一系列的错误。如果我改变ImmutableList::add
到ImmutableList<Int>::add
,我摆脱预期的错误类型参数,它被替换的RxKotlin collectInto()使用方法引用的MutableList
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
:
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>)
这是一个直
val all: Single<MutableList<Int>> = Observable
.range(10, 20)
.collectInto(::MutableList, MutableList::add)
的错误以下Java的副本:
Observable<List<Integer>> all = Observable
.range(10, 20)
.collect(ArrayList::new, List::add);
我知道第一个错误是告诉我它是推断不正确的类型,我需要更明确(在哪里?),但我认为::MutableList
将等于() -> MutableList<Int>
。第三个错误是告诉我,它不能用参数调用任何add()
方法,但我认为MutableList::add
等于{ list, value -> list.add(value) }
。第四个错误告诉我它无法确定应用于collector
的类型。
如果我使用lambda表达式来代替,没有任何错误:
val all: Single<MutableList<Int>> = Observable
.range(10, 20)
.collectInto(mutableListOf(), { list, value -> list.add(value) })
all.subscribe { x -> println(x) }
我会很感激的我在做什么错误的方法引用了一些评论,有明确的东西我误解(通过Kotlin Language Reference查看,我想知道它现在是否是语言功能?)。非常感激。
你是否确信你没有得到与lambda相同的错误?因为我明白了...... – Lovis