La subclass de class sellada de Kotlin debe convertirse a la class base si se proporciona como RxJava Observable

Estoy tratando de evitar los estados terminales de las cadenas de RxJava en mi aplicación escrita en Kotlin, así que descubrí que es correcto transformar Observable<T> en Observable<Result<T>> donde el Result es class sellada.

 sealed class Result<T> data class Success<T>(val data: T) : Result<T>() data class Failure<T>(val throwable: Throwable) : Result<T>() 

Y digamos que tengo esta request de networking observable.

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

Entonces, lo que quiero hacer al final es manejar un resultado como este.

 fun main(args: Array<String>) { getOrganization().subscribe({ when (it) { is Success -> print("success = ${it.data}") is Failure -> print("failure = ${it.throwable}") } }) } 

Todo debería funcionar bien, pero tengo este error en IDE.

error

¿No es simplemente el uso de la subclass en lugar de la class base?

Descubrí que si lanzo explícitamente Success(true) a Result<Boolean> todo funciona, pero muestra esta advertencia.

advertencia

¿Por qué incluso sucede y qué estoy haciendo mal aquí?

UPD. Parece que el problema principal aquí es cerca del operador rxEvava's onErrorReturn. Si lo elimino por completo, entonces funciona incluso sin out palabra key como sugieren las respuestas.

sin onErrorReturn

Si devuelvo Success from map y onErrorReturn then out palabra key ayuda a eliminar errores.

Pero si devuelvo el error de onErrorReturn todavía hay un error. El comstackdor debe saber que el Result Failure tipeó con el mismo Boolean que Success . ¿Qué debo hacer para evitarlo o para satisfacer sus requisitos?

con falla

tal vez malinterprete la varianza genérica en kotlin. funciona bien ya que Success<Boolean> es un subtipo de Result<Boolean> . por lo que la advertencia " No necesita transmitir" informó y el código siguiente funciona bien:

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

Pero no puede asignar un Success<Boolean> a un Result<Any> ya que sus parameters de tipo son diferentes, por lo que este es el motivo por el cual el comstackdor informa el error "No coincide con el tipo ", por ejemplo:

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

para corregir el error y las advertencias, puede probar el siguiente código:

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

para get más detalles, puede ver los subtypes generics de java y las proyecciones de tipo kotlin .

subtipo java genérico

Un Observable<Success<Boolean>> Observable<Result<Boolean>> no es un subtipo Observable<Result<Boolean>> , del mismo modo que List<String> no es un subtipo de List<Object> . Ver la documentation de Generics .

Para resolver esto, devuelva un Observable<out Result<Boolean>> , o agregue explícitamente un tipo a su function de map :

 .map<Result<Boolean>> { Success(true) } 
  • No se pudo deducir Kotlin y RxJava
  • JavaRX: cómo devolver el valor en caching inmediatamente y en paralelo hacer una request de networking
  • ¿Hay alguna manera de orderar las keys groupBy en rx-java / kotlin?
  • Cómo escribir la testing adecuada para el repository de interfaz reactiva que devuelve Observable solo cuando hay algún evento, cómo simular el desencadenamiento de ese evento
  • RxJava2 observable no procesando en Siguiente cuando hay un cambio
  • Espere hasta que dos observables emitan verdadero
  • Orden de configuration de progtwigdores en Rx
  • ¿Alguna diferencia entre "Subject.asObservable ()" y el tema en sí "Subject"?
  • Adaptador personalizado de Moshi con RxAndroid & Retrofit & Kotlin
  • Implementando la búsqueda que empuja los resultados a la list tan pronto como estén disponibles usando rxJava
  • Función rxjava :: zip devuelve un resultado vacío