【问题标题】:Android - Generic Class as return type in Kotlin for Retrofit callAndroid - 通用类作为 Kotlin 中用于改造调用的返回类型
【发布时间】: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"
        }
    }
}

为什么会弹出这个错误? SuccessError 都是 NetworkResult 的子类型...那么为什么不允许返回其中一个?

为了完整起见,我还添加了Retrofit接口调用方法:

@GET("getData/")
suspend fun getData(@Query("page") page:Int) : Response<MyData>

【问题讨论】:

  • 您的NetworkResult&lt;out R&gt; 有一个类型参数R,您需要在函数签名中指定它。因此,无论response.body() 具有何种类型,您都需要在 getData 签名中指定。
  • response.body() 的返回类型是 MyData。

标签: android kotlin generics retrofit2


【解决方案1】:

getData函数的返回类型添加泛型参数:

override suspend fun getData(pageNr: Int): NetworkResult<MyData> {
    // ...
}

您可以将泛型类型更改为MyData?,或者如果您确定response.body() 不会返回null,请添加!! 运算符:NetworkResult.Success(response.body()!!)

【讨论】:

  • 但 else 条件不返回 MyData 实例。相反,使用 response.error() 返回一个 Int 值
  • 没关系,它返回NothingNothing继承了其他类,包括MyData类。
  • android studio 现在抱怨 "Required: NetworkResult" 和 "Found : NetworkResult.Success" 。整个 if-else 分支都带有红色下划线。
  • 好的,我决定用!!并在其周围添加了一个 try/catch 块。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多