在Kotlin功能类型中表达“超级”泛型?

时间:2016-07-29 19:19:01

标签: java generics rx-java kotlin rx-kotlin

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

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

Transformers.collectWhile()是用Java编写的,有这个签名:

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

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

更新

我这个愚蠢的错误。我不应该在深夜发布在SO上。

我实际上是以此为目标

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))

1 个答案:

答案 0 :(得分:3)

Java通配符类型read_failures[error] = read_failures.get(error, []) + [filename] 对应于Kotlin中的? super T use-site type projection,因此相应类型的in T参数将为collect

该类型与Kotlin中的Action2<in R, in T>功能类型大致相同(或更具体地说,有资格获得SAM-conversion)到(R, T) -> Unit功能类型,因为(R, T) -> Unit是类型Function2<R, T, Unit>的同义词,由于Function2类型参数的declaration-site variance,后者等同于Function2<in R, in T, out Unit>

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

更改collect参数的类型或condition参数的类型。