2017-10-19 4 views
0

J'ai rencontré un problème étrange que j'ai du mal à comprendre. J'ai écrit un code qui crée un observable de callable. Il compile bien, mais dès que je spécifie un planificateur pour cela, il change le type de retour et ne compile pas.L'ajout de subscribeOn() modifie le type de retour de l'observable

Voici le code sans subscribeOn (qui compile):

/** 
* 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() 
       } 
      } 
     } 

Et voici le code avec subscribeOn (qui ne compile pas):

/** 
* 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()) 

Le temps de compilation message d'erreur est:

Type mismatch. 
Required: Observable<Collection<Model.RoomBooking>> 
Found: Observable<List<Model.RoomBooking>!>! 

Sûrement, en spécifiant le planificateur ne devrait pas changer le type qui est retourné? Des idées?

+0

Je ne suis pas sûr mais ma première pensée est que (pas familier avec Kotlin) RxKotlin ne comprend pas les types d'héritage (comme Dagger), vous pouvez donc essayer de changer le retour de méthode pour Observable . Encore une fois, une suggestion, pas familier avec la syntaxe de Kotlin. – Inkognito

Répondre

1

Je pense que vous devez définir la co-variance avec le type de retour:

override fun getRoomBookingsForDay(date: Date): Observable<out Collection<Model.RoomBooking>> 

Utilisation du out T est le même que ? extends T en Java.

Vous pouvez également vous assurer d'utiliser uniquement le Collection. Dans votre premier exemple le type de retour de Observable.fromCallable() est déduit par le type de retour du fun alors qu'il est inféré par le type de retour du Callable dans le deuxième exemple. Il suffit donc de le déclarer directement:

Observable.fromCallable<Collections<Model.RoomBooking>> { ... } 
+0

C'est correct, merci –