Agregar subscribeOn () está cambiando el tipo de retorno de observable

Me he encontrado con un problema extraño que estoy luchando por comprender. He escrito un código que crea un observable de invocable. Se comstack bien, pero tan pronto como especifico un planificador para él, cambia el tipo de devolución y no se comstack.

Aquí está el código sin el subscribeOn (que comstack):

/** * Gets all the room bookings for the specified day */ override fun getRoomBookingsForDay(date: Date): Observable<Collection<Model.RoomBooking>> = Observable.fromCallable { Realm.getDefaultInstance().use { realm -> // Get all the bookings that begin and end within the specified date val dbRoomBookings = realm.where(DBRoomBooking::class.java) .greaterThan("timeFromUtc", date) .lessThan("timeToUtc", date) .findAllSorted("timeFromUtc") if (dbRoomBookings.isEmpty()) { emptyList() } else { dbRoomBookings.asSequence().map { dbRoomBooking -> makeRoomBookingModel(dbRoomBooking) }.filterNotNull().toList() } } } 

Y aquí está el código con subscribeOn (que no comstack):

 /** * Gets all the room bookings for the specified day */ override fun getRoomBookingsForDay(date: Date): Observable<Collection<Model.RoomBooking>> = Observable.fromCallable { Realm.getDefaultInstance().use { realm -> // Get all the bookings that begin and end within the specified date val dbRoomBookings = realm.where(DBRoomBooking::class.java) .greaterThan("timeFromUtc", date) .lessThan("timeToUtc", date) .findAllSorted("timeFromUtc") if (dbRoomBookings.isEmpty()) { emptyList() } else { dbRoomBookings.asSequence().map { dbRoomBooking -> makeRoomBookingModel(dbRoomBooking) }.filterNotNull().toList() } } }.subscribeOn(AndroidRealmSchedulers.realmThread()) 

El post de error de time de compilation es:

 Type mismatch. Requinetworking: Observable<Collection<Model.RoomBooking>> Found: Observable<List<Model.RoomBooking>!>! 

Seguramente, ¿especificar el planificador no debería cambiar el tipo que se devuelve? ¿Algunas ideas?

Creo que tienes que definir la co-varianza con el tipo de retorno:

 override fun getRoomBookingsForDay(date: Date): Observable<out Collection<Model.RoomBooking>> 

¿Usar el out T es lo mismo que ? extends T ? extends T en Java.

De forma alternativa, puede asegurarse de usar solo la Collection . En su primer ejemplo, el tipo de retorno de Observable.fromCallable() se infiere por el tipo de retorno de la fun mientras que se deduce por el tipo de retorno de Callable en el segundo ejemplo. Así que solo declararlo directamente:

 Observable.fromCallable<Collections<Model.RoomBooking>> { ... } 
  • RxAndroid, cómo detectar si observable ha finalizado la emisión
  • ¿Cómo puedo agregar de manera condicional una operación asincrónica en medio de una transmisión de RxJava?
  • La suscripción de rx kotlin no funciona, no recibe artículos
  • Comportamiento con Kotlin Higher-Order Functions e interfaces de método único?
  • ¿Cómo corotines de Kotlin son mejores que RxKotlin?
  • Para una function de Kotlin utilizada como expresión, ¿hay una forma concisa de operar y devolver un valor?
  • Llamada asincrónica para cada elemento dentro de una colección
  • No se puede cambiar el text de ActionMenuItemView con RxKotlin
  • OnComplete nunca se llamó con toSortedList () y groupBy ()
  • Rx-Kotlin awaitTerminalEvent nunca se sube a Completo
  • Obtiene N últimos objects emitidos por observables en RxJava2