3

我正在尝试移植 RxJava 库并利用 Kotlin 中的扩展功能。

fun <T,R: MutableCollection<T>> Observable<T>.collectWhile(factory: (() -> R), condition: (R,T) -> Boolean) =
        compose(Transformers.collectWhile(factory,condition))

是用 Java 编写的Transformers.collectWhile(),并具有以下签名:

public static <T, R extends Collection<T>> Transformer<T, R> collectWhile(final Func0<R> factory,
            final Action2<? super R, ? super T> collect)

但是,我遇到了映射collect参数的问题,而且我不擅长泛型。如何super用函数类型表达?

更新

我犯了愚蠢的错误。我不应该在深夜发帖。

我实际上是针对这个

public static <T, R extends Iterable<?>> Transformer<T, R> collectWhile(final Func0<R> factory,
        final Action2<? super R, ? super T> collect, final Func2<? super R, ? super T, Boolean> condition)

这是我应该做的。

fun <T,R: MutableCollection<T>> Observable<T>.collectWhile(factory: (() -> R), action: (R,T) -> Unit, condition: (R,T) -> Boolean) =
    compose(Transformers.collectWhile(factory,action,condition))
4

1 回答 1

7

Java 通配符类型? super T对应于 Kotlin中的in T use-site 类型投影collect,因此对应的参数类型为Action2<in R, in T>.

该类型与 Kotlin 中的函数类型大致等效(或者更具体地说,符合SAM-conversion的条件) ,因为它是类型的同义词,而后者由于Function2 类型参数的声明站点差异而等效。(R, T) -> Unit(R, T) -> UnitFunction2<R, T, Unit>Function2<in R, in T, out Unit>

您不能将类型函数(R, T) -> Boolean作为参数传递给collect,这(R, T) -> Unit是预期的。

要么更改collect参数的类型,要么更改参数的类型condition

于 2016-07-30T05:58:19.677 回答