在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关于collect参数的映射问题,而且我不擅长泛型。 我如何用功能类型来表达super

UPDATE

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

我其实是针对这个

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

Java通配符类型? super T ? super T对应于Kotlin in T 使用站点类型投影 ,所以相应类型的collect参数为Action2<in R, in T>

因为(R, T) -> UnitFunction2<R, T, Unit>类型的同义词,所以在Kotlin中该类型大致相当于(或更具体地说,有资格进行SAM转换 )为(R, T) -> Unit Function2<R, T, Unit> ,由于Function2类型参数的声明站点方差 ,后者相当于Function2<in R, in T, out Unit>

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

要么改变collect参数的类型,要么改变condition参数的类型。