Kotlin登录流程中flatMap转换Observable触发类型不匹配报错
flatMap 类型不匹配报错根因排查与修正方案
报错根因
结合代码与报错信息,类型不匹配的触发原因有两点:
flatMap操作符对传入的lambda表达式有强类型约束:要求lambda必须返回实现SingleSource接口的对象,不能返回任意无类型推导的内容- 当前代码的
when分支存在两个类型偏差:else分支直接调用无返回值的saveResponse(it),整个分支的返回值是Unit类型,不属于SingleSource实现类saveResponse定义的入参类型为LoginResponse,但调用时传入的it是完整的BaseResponse<LoginResponse>包装对象,本身就存在参数类型不匹配的问题
以上问题最终导致整个when表达式的返回值被类型系统推导为Any,和flatMap要求的入参返回值契约不匹配,触发报错。
修正方案
按照flatMap的类型契约调整分支返回逻辑,统一所有分支的返回值类型为Single<Boolean>,修正参数传递错误:
- 从
BaseResponse中取出实际的LoginResponse对象,匹配saveResponse的入参要求 - 执行完本地保存逻辑后,显式返回携带成功状态的
Single.just(true),和空数据分支返回的Single.just(false)保持返回类型一致
修正后的核心代码片段:
val disposable = accountUseCase.login(LoginRequest(phoneNumber, password)).observeOnUI() .doOnSubscribe { progressBarVisibility.postValue(true) } .flatMap { baseResponse -> val loginResponse = baseResponse.data when (loginResponse) { null -> Single.just(false) else -> { saveResponse(loginResponse) Single.just(true) } } } .subscribe(onSuccess, onError) disposables.add(disposable)
避坑提示
- RxJava操作符的lambda返回值为强类型约束,只要存在一个分支的返回值不符合操作符要求的源类型,Kotlin的类型推导就会失效,最终触发全链路的类型不匹配报错
- 编写链式调用时,要明确每个环节
it指代的实际对象类型,避免把外层包装对象直接传给要求内层业务实体的方法
内容的提问来源于stack exchange,提问作者King
相关产品推荐
相关产品推荐

