我有一个用于监听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>?
,它将显示错误有什么办法可以解决?还是我对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使用upper bounds代替通配符。您可以这样声明函数:
fun <T: ApiRs> isNetworkAvailable(apiCallback: ApiCallback<T>?,
context: Context)
关于android - Kotlin中通用通配符作为参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46265621/