You should be able to do this without casting, if you use Func1 always as `Func1[_ >: A, _ <: B]`, and rx.Observable always as `rx.Observable[_ <: A]`. And btw, can't we express this in terms of simpler methods?