2017-09-29 4 views
0

Je veux corriger une erreur de compilateur de type incompatibilité que je reçois du code suivant, où l'inférence de type ne fait pas ce que je veux. J'ai une classe fermée et un flux de rxjava:Comment faire pour monter la valeur de retour d'un constructeur

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) 

incompatibilité Type: Type inférée KFunction1 < @ParameterName Throwable, Result.Failure> mais la fonction! était attendu

Je peux corriger l'erreur en spécifiant explicitement le type de retour de la fonction de cartographe, qui est une sorte de transtypage ascendant du type inféré Result.Success-Result comme ceci:

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

Mais je me demandais si cela upcasting est possible avec une référence de fonction constructeur, quelque chose comme Result::Success as Result

Répondre

1

Le problème est le type inféré. Car logs.map(Result::Success) déduit le type Success au lieu de Result. Than .onErrorReturn(Result::Failure) échoue, car il s'agit d'un type Failure.

Vous pouvez modifier à

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

Le <Result> fait le type explicite.

+0

Parfait, merci! – vlazzle