【发布时间】:2017-06-16 18:51:46
【问题描述】:
以下代码是我尝试将 RxJava 示例转换为 Kotlin。它应该将一堆Int 收集到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,我将摆脱类型参数预期错误,将其替换为:
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 中以下内容的直接副本:
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) }
我会感谢一些 cmets 说明我在方法引用方面做错了什么,因为很明显我误解了一些东西(查看 Kotlin Language Reference,我想知道此时它是否甚至是一种语言功能?)。非常感谢。
【问题讨论】:
-
您确定 lambdas 不会出现同样的错误吗?因为我明白了……
标签: kotlin method-reference rx-kotlin