scalatypeclassimplicitparametric-polymorphism

Using a context bound in a class type parameter


I was under the impression that context bounds would work only on methods:

trait Target[T]

class Post {
  def pinTo[T : Target](t:T)
}

apparently context bounds can be used in class too (but not in trait):

trait Target[T]

class Post[T: Target] {
  def pintTo[T](t:T) 
}

Now I'm confused as to how the evidence can be provided to Post?

class Business
implicit object ev extends Target[Business] // is implicit necessary here ?

val p = new Post[Business] // ?? how do I provide ev ? 

related to Modeling a binary relationship between two types


Solution

  • The A: Foo notation for context bounds is only a shortcut for asking for an implicit value parameter of type Foo[A]. Since traits do not have constructor value parameters, you can not use this with a trait:

    trait Foo[A]
    
    trait Bar[A: Foo] // "error: traits cannot have type parameters with context bounds..."
    

    Whereas in classes it's possible:

    class Bar[A: Foo] {
      def foo: Foo[A] = implicitly[Foo[A]]
    }
    

    Which is just a different way of writing

    class Bar[A](implicit foo: Foo[A])
    

    You provide the evidence like you do in any other normal method call:

    new Bar[Int]()(new Foo[Int] {})  // explicitly
    

    Or:

    implicit val iFoo = new Foo[Int] {}
    
    new Bar[Int]  // implicitly