2017-11-27 1 views
2

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()) 
} 
+0

"lief in eine Reihe von Fehlern" - können Sie ein Beispiel angeben? – Moira

Antwort

0

Von dem, was Sie angegeben haben, so scheint es T immer ein Subtyp von GenericResponse sein - eine Art Parameterbedingung Hinzufügen kann Sei was du willst.

fun <T : GenericResponse> wrapRetrofitExceptionSingle() { 
    ... 
} 
Verwandte Themen