I am trying to provide some typeclasses implementations which involves higher kinded types, as in the following code:
trait Blah[A,B] { def apply(b:B):List[A] } object Blah { implicit def blah1[A,B<:List[A]]:Blah[A,B] = new Blah[A,B]{ def apply(b:B):List[A] = b } implicit def blah2[A,B](implicit ev: B<:<List[A]):Blah[A,B] = new Blah[A,B]{ def apply(b:B):List[A] = b } } object Stuff { def method[A,B](b:B)(implicit blah:Blah[A,B]):List[A] = { blah(b) } method(List(2,3)) } If I remove the method Blah.blah2 , the compiler fails because it can't resolve an implicit. Why does the second form (using an implicit evidence) works instead, and when it should be used?