Я столкнулся с той странной проблемой, которую я пытаюсь понять. Я написал код, который создает наблюдаемый из вызываемого. Он компилируется нормально, но как только я укажу для него планировщик, он изменяет тип возвращаемого значения и не компилируется.
Вот код без subscribeOn (который компилируется):
/** * 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 (который не компилируется):
/** * 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())
Сообщение об ошибке времени компиляции:
Type mismatch. Required: Observable<Collection<Model.RoomBooking>> Found: Observable<List<Model.RoomBooking>!>!
Разумеется, указание планировщика не должно изменять возвращаемый тип? Есть идеи?
Я думаю, вам нужно определить совпадение с возвращаемым типом:
override fun getRoomBookingsForDay(date: Date): Observable<out Collection<Model.RoomBooking>>
Использование out T
такое же, как ? extends T
? extends T
в Java.
В качестве альтернативы вы можете использовать только Collection
. В первом примере возвращаемый тип Observable.fromCallable()
выводится возвращаемым типом fun
то время как он выводится возвращаемым типом Callable
во втором примере. Поэтому просто объявите его напрямую:
Observable.fromCallable<Collections<Model.RoomBooking>> { ... }