在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) -> Unit
是Function2<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
参数的类型。