2017-09-29 13 views
0

Ich möchte einen Typenkonflikt-Compilerfehler beheben, den ich aus dem folgenden Code erhalte, bei dem Typinferenz nicht das tut, was ich möchte. Ich habe eine versiegelte Klasse und einen rxjava Strom:So erhöhen Sie den Rückgabewert eines Konstruktors

sealed class Result { 
    data class Success(val logs: List<Log>) : Result() 
    data class Failure(val throwable: Throwable) : Result() 
    object InFlight : Result() 
} 

val logs: Observable<List<Log>> = getLogs() 
logs.map(Result::Success) 
    .onErrorReturn(Result::Failure) 

Typenkonflikt: geschlossen Typ ist KFunction1 < @ParameterName Throwable, Result.Failure> aber Funktion! wurde

erwartet

ich den Fehler durch explizite Angabe des Mapper Funktion Rückgabetyp beheben kann, die von dem abgeleiteten Typ Upcasting Result.Success-Result wie so eine Art ist:

 logs.map({ logs -> 
      Result.Success(logs) as Result 
     }) 

Aber ich frage mich, ob diese Upcasting ist möglich mit einer Konstruktorfunktionsreferenz, so etwas wie Result::Success as Result

Antwort

1

Das Problem ist der abgeleitete Typ. Denn logs.map(Result::Success) leitet den Typ Success statt Result. Als .onErrorReturn(Result::Failure) schlägt fehl, weil es ein Failure Typ ist.

Sie können es ändern, um

logs.map<Result>(Result::Success) 
    .onErrorReturn(Result::Failure) 

Die <Result> macht der Typ explizit.

+0

Perfekt, danke! – vlazzle

Verwandte Themen