Замечание типа Observable.combineLatest в kotlin

Я использую RxJava2, Kotlin-1.1 вместе с RxBindings в моем проекте.

У меня есть простой экран входа с отключенной кнопкой входа в систему, я хочу включить кнопку только тогда, когда поля пользователя и пароль не будут пустыми.

LoginActivity.java

Observable<Boolean> isFormEnabled = Observable.combineLatest(mUserNameObservable, mPasswordObservable, (userName, password) -> userName.length() > 0 && password.length() > 0) .distinctUntilChanged(); 

Я не могу перевести вышеуказанный код с Java на Kotlin:

LoginActivity.kt

 class LoginActivity : AppCompatActivity() { val disposable = CompositeDisposable() private var userNameObservable: Observable<CharSequence>? = null private var passwordObservable: Observable<CharSequence>? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_login) initialize() } fun initialize() { userNameObservable = RxTextView.textChanges(username).skip(1) .debounce(500, TimeUnit.MILLISECONDS) passwordObservable = RxTextView.textChanges(password).skip(1) .debounce(500, TimeUnit.MILLISECONDS) } private fun setSignInButtonEnableListener() { val isSignInEnabled: Observable<Boolean> = Observable.combineLatest(userNameObservable, passwordObservable, { u: CharSequence, p: CharSequence -> u.isNotEmpty() && p.isNotEmpty() }) } } 

Я предположил, что это связано с типом вывода третьего аргумента в combinelatest , но я не понимаю проблему, читая сообщение об ошибке: Вывод типа вывода

Ваша проблема заключается в том, что компилятор не может определить, какое переопределение combineLatest для вызова, поскольку у нескольких из них есть функциональные интерфейсы в качестве их третьего параметра. Вы можете сделать преобразование явным с помощью конструктора SAM следующим образом:

 val isSignInEnabled: Observable<Boolean> = Observable.combineLatest( userNameObservable, passwordObservable, BiFunction { u, p -> u.isNotEmpty() && p.isNotEmpty() }) 

Ps. Спасибо, что задали этот вопрос, это помогло мне понять, что я изначально ошибался в этом вопросе, который оказался той же проблемой, и теперь я обновил это решение. https://stackoverflow.com/a/42636503/4465208

Вы можете использовать RxKotlin, который дает вам вспомогательные методы для проблемы двусмысленности SAM.

 val isSignInEnabled: Observable<Boolean> = Observables.combineLatest( userNameObservable, passwordObservable) { u, p -> u.isNotEmpty() && p.isNotEmpty() }) 

Как вы можете видеть, в RxKotlin используют Observables вместо Observable