1

理解するのに苦労している奇妙な問題に遭遇しました。callable から observable を作成するコードをいくつか書きました。正常にコンパイルされますが、スケジューラを指定するとすぐに戻り値の型が変更され、コンパイルされません。

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>!>!

確かに、スケジューラーを指定しても、返されるタイプが変更されるべきではありませんか? 何か案は?

4

1 に答える 1