Search code examples
scalareactive-programmingobservablerx-scala

How to add a method to Observable trait?


I would like to add a method to the Observable class. What I have done so far was:

object Extension {

implicit class ObservableExtensions(obs: Observable[Double]) extends Observable{

    def fakeMethod (alpha: Double): Observable[Double] = {
      obs
        .map(v => v+alpha) 
      }

    }

 }  

But I get:

Error: trait Observable takes type parameters
implicit class ObservableExtensions(obs: Observable[Double]) extends Observable{
                                                                   ^

What's wrong?


Solution

  • manish is true in that Observable actually isn't just a trait, it is a parametrized trait. That means you must supply it a type parameter in order to turn it into a trait you can actually extend (like in class Foo extends Observable[Double], where you turn a parametrized trait Observable into a trait Observable[Double] and then extend class Foo with it.

    zxswing has already said it, you don't need to extends Observable at all. Just do a

    import rx.lang.scala.Observable
    
    object Extension {
      implicit class ObservableExtensions(obs: Observable[Double]) {
        def fakeMethod(alpha: Double): Observable[Double] = obs.map(_+alpha) 
      }
    }  
    
    import Extension._
    Observable
        .just(1.0, 2.0, 3.0)
        .fakeMethod(10)
        .subscribe(println, println, println)
    

    see http://docs.scala-lang.org/overviews/core/implicit-classes.html for reference.