用于保存網路請求結果的通用類
sealed class Result<out T : Any?> {
data class Success<out T : Any?>(val data: T) : Result<T>()
data class Error(val message: String, val exception: Exception? = null) : Result<Nothing>()
}
用于將網路結果封裝到Result. 它是從存盤庫中呼叫的,并將retrofit2 api 呼叫作為輸入引數傳遞
suspend fun <T: Any?> request(method: Call<T>): Result<T> {
return withContext(Dispatchers.IO) {
try {
val response = method.awaitResponse() // Retrofit2 Call
if (response.isSuccessful)
Result.Success(response.body())
else
response.getErrorResult()
} catch (e: Exception) {
Result.Error(e.message.orEmpty(), e)
}
}
// Type mismatch.
// Required: Result<T>
// Found: Result<T?>
}
它是這樣稱呼的
interface Webservice {
@GET("data")
fun getData(): Call<Data> // Retrofit2
}
suspend fun getData(): Result<Data> {
return request(webservice.getData())
}
為什么它將結果推斷為 typeT?而不是T?
uj5u.com熱心網友回復:
問題是這一行:
Result.Success(response.body())
body標記為Nullable,因此當移植到 Kotlin 時,response.body()回傳 a T?,而不是T. 請參閱此處了解其作業原理。
因此,型別引數 forResult.Success被推斷為T?,因此上面的運算式創建了Result<T?>。注意TinResult<T?>指的是 的型別引數request。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/406220.html
標籤:
上一篇:mm:ss:SSS到LocalTimeKotlin/Java型別的字串
下一篇:如何將加載程序從0設定為100?
