Kotlin中通用通配符作为参数

伊万

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

abstract class ApiCallback<in T : ApiRs> {

    open fun onSucceed(apiRsModel: T) {}

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

并且我还编写了一个函数来在请求api之前检查网络状态,如果网络未连接,它将触发 onFailed

fun isNetworkAvailable(apiCallback: ApiCallback<ApiRs>?,
                           context: Context): Boolean{
        val connectivityManager = context
                .getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        val networkInfo = connectivityManager.activeNetworkInfo

        // device network unreachable
        if (networkInfo == null
                || !networkInfo.isConnected) {
            // callback with network error
            apiCallback?.onFailed(code, message)
            return false
        }

        return true
    }

参数类型ApiCallback<ApiRs>?实际上我想像这样写ApiCallback<? extends ApiRs>?,但是Kotlin没有通配符。如果我将通用替换为ApiCallback<out ApiRs>?,它将显示错误

投影与ApiCallback的相应类型参数的方差冲突

有什么办法可以解决?还是我对Kotlin泛型的概念有误?


2017/09/18更新-正确的方法是:

方法 :

fun <T : ApiRs> isNetworkAvailable(apiCallback: ApiCallback<T>?,
                                       context: Context): Boolean {
        val connectivityManager = context
                .getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        val networkInfo = connectivityManager.activeNetworkInfo

        // device network unreachable
        if (networkInfo == null
                || !networkInfo.isConnected) {
            // callback with network error
            callbackWithFailed(
                    apiCallback,
                    ApiError.API_ERROR_CODE_0,
                    context.getString(R.string.api_error_code_0))
            return false
        }

        return true
    }
s1m0nw1

我了解您想以apiCallback: ApiCallback<ApiRs>?一种通用类型ApiCallback可以是ApiRs其自身或任何子类型的方式接受您的方法科特林没有通配符,而是有上限您可以这样声明函数:

fun <T: ApiRs> isNetworkAvailable(apiCallback: ApiCallback<T>?,
                       context: Context)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章