Ich habe folgende Datenklassen in Kotlin als Referenz:Warum kann ich die Schnittstelle nicht als generischen Typ in diesem Rx-Transformator verwenden?
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
implementiert GenericResponse
. Ich bin mit einem Retrofit-API auf die folgende Weise:
@POST("******")
fun createSession(@Body body: LoginBody): Single<Response<LoginResponse>>
Außerdem verwende ich einen Transformator, um die Fehler aus den LoginResponse
zu extrahieren, wenn es wie unten gezeigt vorhanden ist:
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() }
}
}
}
}
}
Wie Sie sehen können Ich muss den Antworttext in eine GenericResponse
Instanz umwandeln und dann die Anmeldung in der ExceptionTransformer
fortsetzen. Meine Frage ist dies: Gibt es eine Möglichkeit, den Rückgabetyp als GenericResponse
anstelle von T
(das generische) zu verwenden? Ich habe versucht, das zu tun - sondern lief in eine Reihe von Fehlern, wenn es wie folgt aus:
fun createSession(loginBody: LoginBody): Single<LoginResponse> {
return apiService.createSession(loginBody)
.compose(exceptionTransformers.wrapRetrofitExceptionSingle())
}
"lief in eine Reihe von Fehlern" - können Sie ein Beispiel angeben? – Moira