Выражение супердженериков в функциональных типах 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 с функциональным типом?

ОБНОВЛЕНИЕ

Глупая ошибка с моей стороны. Я не должен был публиковать ТАК поздно ночью.

Я на самом деле ориентировался на это

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

person tmn    schedule 29.07.2016    source источник
comment
пожалуйста, добавьте сообщение об ошибке, которое вы получаете   -  person voddan    schedule 30.07.2016


Ответы (1)


Тип подстановочного знака Java ? 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, либо тип параметра condition`.

person Ilya    schedule 30.07.2016
comment
О, теперь я чувствую себя глупо. Была поздняя ночь, когда я сделал это. Я обновлю свой ответ. - person tmn; 30.07.2016