我在Kotlin中有以下数据类作为参考:
interface GenericResponse {
val error: Error?
fun hasErrorObject(): Boolean = error != null
}
data class LoginResponse(
val name: String,
val auth: String,
@SerializedName("error") override val error: Error? = null
) : GenericResponse
LoginResponse
实现GenericResponse
。我以以下方式使用Retrofit API:@POST("******")
fun createSession(@Body body: LoginBody): Single<Response<LoginResponse>>
此外,我使用转换器从
LoginResponse
中提取错误(如果存在),如下所示:class ExceptionTransformers {
fun <T> wrapRetrofitExceptionSingle(): (Single<Response<T>>) -> Single<T> {
return { it: Single<Response<T>> ->
it.flatMap { response: Response<T> ->
if (response.code() == 200 && response.body() != null) {
val genericResponse = response.body() as GenericResponse
if (genericResponse.hasErrorObject()) {
Single.error { MyException(genericResponse.error!!) }
} else {
Single.just(response.body()!!)
}
} else {
Single.error { UnknownError() }
}
}
}
}
}
如您所见,我必须将响应主体转换为
GenericResponse
实例,然后继续在ExceptionTransformer
中登录。我的问题是:是否可以将返回类型用作GenericResponse
而不是T
(泛型)?我试图这样做-但是在使用这种方法时遇到了许多错误:fun createSession(loginBody: LoginBody): Single<LoginResponse> {
return apiService.createSession(loginBody)
.compose(exceptionTransformers.wrapRetrofitExceptionSingle())
}
最佳答案
从您指定的内容来看,T
似乎永远是GenericResponse
的子类型-添加类型参数约束可能是您想要的。
fun <T : GenericResponse> wrapRetrofitExceptionSingle() {
...
}