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):
- La biblioteca de Kotlin 'rxkotlin-0.21.0.jar' tiene un formatting no compatible. Actualice la biblioteca o el complemento
- Inyectar constructor y object complementario
- ¿Puedo crear un método de extensión Kotlin para agregar una suscripción rxJava a una suscripción compuesta?
- Llamada asincrónica para cada elemento dentro de una colección
- ¿Cómo leer JSON desde Url usando kotlin Android?
/** * 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?
- ¿Cómo escalar dinámicamente el rebote de la stream de emisión de ráfagas?
- Obligatorio <Objeto> y encontrado <Objeto>?
- La suscripción de rx kotlin no funciona, no recibe artículos
- RxKotlin flattenAsObservable (): no coincide con el método de reference
- Spring 5 and Kotlin 1.1 Coroutines: Type rx.Scheduler no presente
- Cómo comprimir algunos observables en lenguaje Kotlin con RxAndroid
- Cómo notificar a Observable cuando finalice CountdownTimer
- Repetir acciones en estado con RxJava
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>> { ... }
- Referencia no resuelta de Kotlin: agregar después de convertir del código de Java
- Kotlin: Pase el object en function como reference y cambie su instancia