我在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() {
    ...
}

10-05 18:56