通用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>? ApiCallback<? extends ApiRs>? ,但Kotlin没有通配符。 如果我将ApiCallback<out ApiRs>?替换为泛型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 } 

我明白,你想接受apiCallback: ApiCallback<ApiRs>? 在你的方法中,通用类型的ApiCallback可以是ApiRs本身或其任何子类型。 Kotlin不是通配符,而是上限 。 你可以像这样声明函数:

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