平面图无法投射到右侧

Posted

技术标签:

【中文标题】平面图无法投射到右侧【英文标题】:Flatmap fails to cast to right one 【发布时间】:2021-06-25 08:58:45 【问题描述】:

我正在尝试在我的登录功能中转换 Observable,但我不断收到此错误。这是我在 flatMap 上遇到的代码和错误

fun login(phoneNumber: String, password: String, deviceId: String) 
        // remove previous subscriptions
        disposables.clear()

        // function to save userInfo and access token
        val saveResponse =  response: LoginResponse ->
            val user = response?.user
            val token = response?.token
//            userManager.updateToken(champion, token, deviceId)
        

        // on success callback
        val onSuccess =  isSuccess: Boolean ->
            progressBarVisibility.postValue(false)
            loginSuccess.postValue(isSuccess)
            if (!isSuccess) errorMessage.postValue("An error occurred please try again.")
        

        // on failure callback
        val onError =  throwable: Throwable ->
            val message = when (throwable) 
                is HttpException -> when (throwable.code()) 
                    400 -> "Enter valid Phone Number or Password"
                    422 -> "Incorrect Phone Number or Password"
                    else -> throwable.toErrorMessage()
                

                else -> "An Error Occurred."
            

            // show error message
            errorMessage.postValue(message)
            progressBarVisibility.postValue(false)
        

        val disposable = accountUseCase.login(LoginRequest(phoneNumber, password)).observeOnUI()
                .doOnSubscribe  progressBarVisibility.postValue(true) 
                .flatMap 
                    val resp = it.data
                    when (resp) 
                        null -> Single.just(false)
                        else -> saveResponse(it)
                    
                
                .subscribe(onSuccess, onError)

        // add subscription to disposables
        disposables.add(disposable)
    

错误

Type mismatch. Required: ((BaseResponse<LoginResponse>!) → SingleSource<out (???..???)>!)! Found: (BaseResponse<LoginResponse>!) → Any!

【问题讨论】:

when的一个分支正在返回一个单曲,saveResponse返回什么? 【参考方案1】:

问题在于flatMap 的隐式返回:

when (resp) 
    null -> Single.just(false)
    else -> saveResponse(it)

null分支中,返回类型为Single&lt;Boolean&gt;

else 分支中,您返回saveResponse 的结果。但是saveResponse的返回类型是Unit,因为它什么都不返回。

因此,Kotlin 将 flatMap 的返回类型推断为 Single&lt;Boolean&gt;Unit,其中唯一常见的超类型是 Any

这就是您收到错误消息的原因:Found: (BaseResponse&lt;LoginResponse&gt;!) → Any!

您需要让saveResponse 返回一些内容,可能还有Single&lt;Boolean&gt;,具体取决于您的用例。

【讨论】:

以上是关于平面图无法投射到右侧的主要内容,如果未能解决你的问题,请参考以下文章

平面阴影投射矩阵的推导

CEOI 2011Traffic

R语言ggplot2可视化分面图(faceting)设置每个分面的标题在右侧(right side)并在右侧分面图的外侧添加整图的标题信息(facet title)

分治 -- 平面最近点对

检测墙壁或平面(使用 OpenCV)?

如何用图像绘制等距平面? [复制]