Observable.combine在kotlin中的最新类型推断

我在我的项目中使用了RxJava2,Kotlin-1.1和RxBindings。

我有简单的登录屏幕,默认情况下禁用“登录”按钮,我只想在用户名和密码edittext字段不为空时启用按钮。

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调用哪个覆盖,因为多个功能接口作为他们的第三个参数。 你可以使用这样的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