【发布时间】:2020-06-22 16:53:36
【问题描述】:
我有以下方法:
override suspend fun getData(pageNr: Int): NetworkResult {
// make the request
val response = getDataApi.getData(pageNr)
// based on response, return either Success or Error
return if(response.isSuccessful){
NetworkResult.Success(response.body())
} else{
NetworkResult.Error(response.code())
}
}
Android Studio 抱怨返回类型。它说:
"One type argument expected for class NetworkResult<out R>"
我的NetworkResult.kt如下:
sealed class NetworkResult<out R> {
data class Success<out T>(val data: T) : NetworkResult<T>()
data class Error(val errorCode: Int) : NetworkResult<Nothing>()
object Loading : NetworkResult<Nothing>()
override fun toString(): String {
return when (this) {
is Success<*> -> "Success[data=$data]"
is Error -> "Error[code=$errorCode]"
Loading -> "Loading"
}
}
}
为什么会弹出这个错误? Success 和 Error 都是 NetworkResult 的子类型...那么为什么不允许返回其中一个?
为了完整起见,我还添加了Retrofit接口调用方法:
@GET("getData/")
suspend fun getData(@Query("page") page:Int) : Response<MyData>
【问题讨论】:
-
您的
NetworkResult<out R>有一个类型参数R,您需要在函数签名中指定它。因此,无论response.body()具有何种类型,您都需要在 getData 签名中指定。 -
response.body() 的返回类型是 MyData。
标签: android kotlin generics retrofit2