Kotlin и RxJava2 zip operator – Ни одна из следующих функций не может быть вызвана с предоставленными аргументами

У меня возникла проблема с написанием .zip Observable в Kotlin с использованием Android Studio 3.0 IDE.

Вот мой код:

internal var updateStringEventsSubject = PublishSubject.create<String>() internal var updateIntEventsSubject = PublishSubject.create<Int>() internal var triggerSave = PublishSubject.create<Boolean>() internal var triggerStopAndSave = PublishSubject.create<Boolean>() internal var normalSaveTrigger = triggerSave.debounce(30, TimeUnit.SECONDS) internal var trigger = Observable.merge(normalSaveTrigger, triggerStopAndSave) private fun saveEvents( strings: List<String>, integers: List<Int>, someBoolean: Boolean): Boolean { return true //doesn't matter for now } fun temp() { Observable.zip<List<String>, List<Int>, Boolean, Boolean>(updateStringEventsSubject.buffer(trigger), updateIntEventsSubject.buffer(trigger), trigger, { strings: List<String>, integers: List<Int>, someBoolean: Boolean -> saveEvents(strings, integers, someBoolean) }) .subscribe() } 

Однако моя IDE (Android Studio 3.0 RC2) подчеркивает оператор .zip и говорит:

Приведенные аргументы не могут быть вызваны ни одной из следующих функций. zip (((observer: Observer!>) → Unit) !, ((observer: Observer!>) → Unit) !, ((observer: Observer) → Unit) !, ((t1: List, t2: List, t3 : Boolean) → Boolean)!), Где T1 = List, T2 = List, T3 = Boolean, R = Boolean для fun zip (source1: ((observer: Observer) → Unit) !, source2: ((observer: Observer) → Unit) !, source3: ((observer: Observer) → Unit) !, молния: ((t1: T1, t2: T2, t3: T3) → R)!): Наблюдаемый! ((observer: Observer!>) → Unit) !, ((t1: List, t2: List) → Boolean) !, () Boolean), где T1 = List, T2 = List, R = Boolean для fun zip (source1: ((observer: Observer) → Unit) !, source2: ((observer: Observer) → Unit) !, zipper: ((t1: T1, t2: T2) → R) !, delayError: Boolean): Наблюдаемый! определяемый в io.reactivex.Observable zip (ObservableSource!> !, ObservableSource!> !, ObservableSource !, io.reactivex.functions.Function3 !, в List !, in Boolean !, out Boolean!>!), где T1 = List, T2 = List, T3 = Boolean, R = Boolean для fun zip (source1: ObservableSource !, source2: ObservableSource !, source3: ObservableSource !, zipper: Function3!): Observable! определяемый в io.reactivex.Observable zip (ObservableSource!> !, ObservableSource!> !, BiFunction !, в List !, out Boolean!> !, Boolean), где T1 = List, T2 = List, R = Boolean для fun zip ( source1: ObservableSource !, source2: ObservableSource !, zipper: BiFunction !, delayError: Boolean): Наблюдаемый! определен в io.reactivex.Observable

Как заставить его работать с Котлином?

По какой-то причине использование RxJava 1.1.7 в нем явно указывает тип аргумента zipper как Func3 – избыточный SAM-конструктор (который он есть) и позволяет заменить его на лямбда. Однако, используя RxJava 2.1.5, тип изменяется на Function3, и он больше не распознает его как интерфейс с одним абстрактным методом (который он по-прежнему есть). Я не знаю, почему это так.

Несмотря на это, указание типа функции застежки-молнии сделает трюк:

 import io.reactivex.functions.Function3 ... fun temp() { Observable.zip<List<String>, List<Int>, Boolean, Boolean>(updateStringEventsSubject.buffer(trigger), updateIntEventsSubject.buffer(trigger), trigger, Function3 { strings, integers, someBoolean -> saveEvents(strings, integers, someBoolean) } ) .subscribe() } 

Примечание. Мне удалось заставить его работать без явного указания аргументов типа для Function3 . Это может зависеть от того, какую версию Kotlin или RxJava вы используете, может ли она вывести типы. Если нет, вы всегда можете быть более явными:

 Function3<List<String>, List<Int>, Boolean, Boolean> { ... } 
Intereting Posts
Не удалось запустить приложение Kotlin в Eclipse Kotlin: Как дочерний класс может использовать функцию расширения родителя в вызове супер-конструктора? Kotlin для игры dev Что эквивалентно статическим конечным полям Java в Котлине? Котлин || Не удалось добавить библиотеку в Мое приложение? Обобщить метод с нулевыми аргументами и возвращаемым типом Особенность Kotlin `typealias` Каков правильный способ установки и семени базы данных с помощью искусственных данных для тестирования интеграции Не понимаю, как сделать подписку на флюс, работающую в Котлине Код Refactor, чтобы не вызывать ненужное исключение MockitoStubbingException Объявление поля статического интерфейса в Котлине Неразрешенная ссылка: kotlinx – Kotlin 1-0-0-rc-1036 Класс не найден исключение с некоторыми сборками Kotlin: получить суперкласс из объекта класса – ошибка вывода объекта Литералы класса Kotlin с пустой левой стороной еще не поддерживаются?