我正在尝试移植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))
答案 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
参数的类型。