私はKotlinで書かれたアプリケーションのRxJavaチェーンの終端状態を避けるため、Observable<T>
を変換することが正しいことが分かりました。 Observable<Result<T>>
Result
は封印されたクラスです。Kotlin密閉クラスのサブクラスは、RxJavaとして提供されている場合は基底クラスにキャストする必要があります。Observable
sealed class Result<T>
data class Success<T>(val data: T) : Result<T>()
data class Failure<T>(val throwable: Throwable) : Result<T>()
このネットワーク要求を観測可能としましょう。
fun getOrganization(): Observable<Result<Boolean>> {
return api.getOrganization("google")
.map { Success(true) }
.onErrorReturn { Failure(RuntimeException("throwable")) }
}
私が最後にやりたいことは、このような結果を処理することです。
fun main(args: Array<String>) {
getOrganization().subscribe({
when (it) {
is Success -> print("success = ${it.data}")
is Failure -> print("failure = ${it.throwable}")
}
})
}
すべてがうまくいくはずですが、私はこのエラーがIDEにあります。
ではなく、基本クラスのサブクラスを使用して、それだけで簡単ではありませんか?
Success(true)
をResult<Boolean>
に明示的にキャストすると、すべてが機能することがわかりましたが、この警告が表示されます。
なぜそれも起こると私は間違ってここで何をやっていますか?
UPD。 rxjavaのonErrorReturn演算子の近くに主な問題があるようです。私がそれを完全に削除すると、回答のようなキーワードout
がなくても機能します。
私はマップとonErrorReturnの両方からSuccess
を返す場合、out
キーワードはエラーを取り除くのに役立ちます。
しかし、私がFailure
をonErrorRurnから返すと、まだエラーがあります。コンパイラはFailure
Result
と入力し、Boolean
と入力してSuccess
とする必要があります。それを避けるために、あるいはその要件を満たすために私は何をすべきですか?
はあなたが出て、<観察可能な結果に戻り値の型を設定しようとしたことがありますか?または、RxJavaのcast()演算子を使用しようとする可能性があります。 –
Buckstabue