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>> { ... } 
  • Para una function de Kotlin utilizada como expresión, ¿hay una forma concisa de operar y devolver un valor?
  • RxAndroid, cómo detectar si observable ha finalizado la emisión
  • ¿Cómo corotines de Kotlin son mejores que RxKotlin?
  • Crear nueva instancia de object Kotlin
  • No se puede cambiar el text de ActionMenuItemView con RxKotlin
  • Kotlin con stack RxKotlinFX da un error de class de acceso
  • RxKotlin - Single.just () no se emite al suscribirse TestSubscriber
  • Obtiene N últimos objects emitidos por observables en RxJava2
  • Cómo pasar nulo a un Observable con tipo anulable en RxJava 2 y Kotlin
  • Usando RxJava para unir datos locales con datos remotos (o en caching)
  • OnComplete nunca se llamó con toSortedList () y groupBy ()