Я пытаюсь передать библиотеку 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))
Тип шаблона Java ? super T
? super T
соответствует проекции типа in T
-типа в Kotlin, поэтому соответствующим типом параметра collect
будет Action2<in R, in T>
.
Этот тип примерно эквивалентен (или, более конкретно, имеет право на преобразование SAM ) в функциональный тип (R, T) -> Unit
в Kotlin, потому что (R, T) -> Unit
является синонимом типа Function2<R, T, Unit>
а последний эквивалентен Function2<in R, in T, out Unit>
из -за дисперсии объявления-сайта параметров типа Function2.
Вы не можете передать функцию типа (R, T) -> Boolean
в качестве аргумента для collect
, где ожидается (R, T) -> Unit
.
Либо измените тип параметра collect
, либо тип параметра условия`.