首页 文章

Kotlin中的通配符通用参数

提问于
浏览
2

我有一个抽象类用于listen 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
    }

1 回答

  • 2

    我知道您希望在方法中接受 apiCallback: ApiCallback<ApiRs>? ,其方式是 ApiCallback 的泛型类型可以是 ApiRs 本身或其任何子类型 . Kotlin没有使用通配符,而是拥有upper bounds . 您可以像这样声明函数:

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

相关问题