我正在尝试使用改造从服务器获取数据。我使用了泛型,因为我不想在项目中使用重复的代码。但是,当类型为T时,我无法在响应主体内部获取值。仅当我专门编写服务器响应的类名时,才能访问它。
这是我的代码:
private fun <T> requestFun(call: Call<T>, default: T) {
call.enqueue(object : Callback<T> {
override fun onResponse(call: Call<T>, response: Response<T>) {
response.body()
}
override fun onFailure(call: Call<T>?, t: Throwable) {
}
})
}
这是我的模特
data class JsonResponse<T>(
var data: List<T>? = null,
var success: Boolean = true)
我希望能够使用response.body.result取回数据列表。但是,这不起作用,因为在函数中我将类型设为通用类型,而不是JsonResponse!
答案 0 :(得分:0)
您可能应该这样使用它:
private fun <T> requestFun(call: Call<T>, onSuccess: (T) -> Unit) {
call.enqueue(object : Callback<T> {
override fun onResponse(call: Call<T>, response: Response<T>) {
onSuccess(response.body())
}
override fun onFailure(call: Call<T>?, t: Throwable) {
}
})
那你可以做
requestFun<MyClass>(myCall) { myClass: MyClass ->
...
}
当然,这没有任何错误处理,但这是有可能的。
在您的情况下,您实际上并未收到T
,而是出于未知原因收到了JsonResponse<T>
,因此您可以这样做:
private fun <T> requestFun(call: Call<JsonResponse<T>>, onSuccess: (List<T>) -> Unit) {
call.enqueue(object : Callback<JsonResponse<T>> {
override fun onResponse(call: Call<JsonResponse<T>>, response: Response<JsonResponse<T>>) {
val body = response.body()
onSuccess(body.data ?: Collections.emptyList())
}
override fun onFailure(call: Call<JsonResponse<T>>?, t: Throwable) {
}
});
}