2017-06-15 11 views
4

私は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にあります。

error

ではなく、基本クラスのサブクラスを使用して、それだけで簡単ではありませんか?

Success(true)Result<Boolean>に明示的にキャストすると、すべてが機能することがわかりましたが、この警告が表示されます。

warning

なぜそれも起こると私は間違ってここで何をやっていますか?

UPD。 rxjavaのonErrorReturn演算子の近くに主な問題があるようです。私がそれを完全に削除すると、回答のようなキーワードoutがなくても機能します。

without onErrorReturn

私はマップとonErrorReturnの両方からSuccessを返す場合、outキーワードはエラーを取り除くのに役立ちます。

しかし、私がFailureをonErrorRurnから返すと、まだエラーがあります。コンパイラはFailureResultと入力し、Booleanと入力してSuccessとする必要があります。それを避けるために、あるいはその要件を満たすために私は何をすべきですか?

with failure

+3

はあなたが出て、<観察可能な結果に戻り値の型を設定しようとしたことがありますか?または、RxJavaのcast()演算子を使用しようとする可能性があります。 – Buckstabue

答えて

3

は、多分あなたはkotlinで、一般的な分散を誤解:どちらか、この問題を解決Observable<out Result<Boolean>>を返す、または明示的にあなたのmap機能にタイプを追加するには

Success<Boolean>はサブタイプResult<Boolean>であるため、正常に動作します。

val ok:Success<Boolean> = Success(true); 
val result:Result<Boolean> = ok; 

しかしあなたはそれらの型パラメータが異なるためResult<Any>からSuccess<Boolean>を割り当てるので、この理由コンパイラレポートすることはできません:その警告が報告され、以下のコードは正常に動作します「必要はありませをキャストしません」例えば、「タイプ不一致」エラー、:

val ok:Success<Boolean> = Success(true); 
val result1:Result<Any> = ok;// error 
val result2:Result<out Any> = ok;// ok 

あなたは以下のコードを試すことができ、エラーや警告を修正するには

fun getOrganization(): Observable<out Result<Boolean>> { 
    return api.getOrganization("google") 
      .map<Result<Boolean>> { Success(true) } 
      .onErrorReturn { Failure(RuntimeException("throwable")) } 
} 

詳細はjava generic subtypes & kotlin type projectionsです。

java generic subtype

+0

これは完全に意味をなさないですが、まだ失敗しています。私は新しい内容で質問を更新しました。 –

+1

@P_Kingは 'map > {...}'としてマップに 'Result 'を返します。 –

2

Observable<Success<Boolean>>List<String>List<Object>のサブタイプではないのと同様に、サブタイプObservable<Result<Boolean>>ではありません。 Genericsのドキュメントを参照してください。

.map<Result<Boolean>> { Success(true) } 
関連する問題