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