1

用于保存网络请求结果的通用类

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

4

1 回答 1

1

问题是这一行:

Result.Success(response.body())

body标记为Nullable,因此当移植到 Kotlin 时,response.body()返回 a T?,而不是T. 请参阅此处了解其工作原理。

因此,类型参数 forResult.Success被推断为T?,因此上面的表达式创建了Result<T?>。注意TinResult<T?>指的是 的类型参数request

于 2022-01-08T16:34:29.697 回答