【问题标题】:Kotlin generic parameter using in functionKotlin 泛型参数在函数中使用
【发布时间】:2018-02-26 15:46:22
【问题描述】:

我得到了这个问题的解决方案:Wildcards generic in Kotlin for parameter,但现在我还有其他与 kotlin generic 相关的问题

我有一个抽象类,用于如下所示的监听 api 回调。 ApiRs 是每个 API 响应对象都继承自它的父对象

abstract class ApiCallback<in T : ApiRs> {

    open fun onSucceed(apiRsModel: T) {}

    open fun onFailed(code: Int,
                      message: String) {
    }
}

这次我写了一个函数来处理 api 成功与 Retrofit2,而不是检查一些东西并回调 UI,这是我的函数:

fun <T : ApiRs> callbackWithSucceed(apiCallback: ApiCallback<T>?,
                                        context: Context,
                                        response: Response<out ApiRs>?) {
        // unexpected error
        if (response == null) {
            encounterUnexpectedError(apiCallback, context, null)
            return
        }

        // check http
        val httpSucceed = response.code() == CODE_HTTP_SUCCEED
                && response.isSuccessful
                && response.body() != null
        if (!httpSucceed) {
            // HTTP response with error
            callbackWithFailed(
                    apiCallback,
                    response.code(),
                    response.message())
            return
        }

        apiCallback?.onSucceed(response.body()!!)
    }
}

response 是 Retrofit2 类,其中包含我的 API 响应模型(主体),每个响应模型都继承 ApiR,我的目标是使用这种方式将模型传递给抽象类 apiCallback?.onSucceed(response.body()!!) 但它会显示错误

类型不匹配,需要 T?但是找到了 ApiR?

抱歉,我对泛型有不好的概念。我认为函数open fun onSucceed(apiRsModel: T) {} T 应该继承 ApiRs 因为我在类中定义,所以我不明白为什么会显示错误消息?

【问题讨论】:

    标签: android kotlin


    【解决方案1】:

    你的response: Response&lt;out ApiRs&gt;? 必须是response: Response&lt;out T&gt;?,那么错误应该消失了。

    将传递给方法onSuccessT 的类型必须与apiCallback 参数的泛型类型匹配,该类型不是&lt;ApiRs&gt;,而是&lt;T&gt;

    【讨论】:

    • 不客气。下次还可以重用旧题
    猜你喜欢
    • 2019-11-11
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多