Добавление subscribeOn () изменяет тип возвращаемого вида

Я столкнулся с той странной проблемой, которую я пытаюсь понять. Я написал код, который создает наблюдаемый из вызываемого. Он компилируется нормально, но как только я укажу для него планировщик, он изменяет тип возвращаемого значения и не компилируется.

Вот код без 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>> { ... }