I'm having a little trouble understanding the following phenomenon:
trait Trait[A] { def traitType: String } object Trait { implicit val stringTrait: Trait[String] = new Trait[String] { def traitType: String = "string" } implicit val intTrait: Trait[Int] = new Trait[Int] { def traitType: String = "int" } } class Media[A] { // works def mediaType(implicit t: Trait[A]): String = t.traitType // does not compile def mediaType: String = implicitly[Trait[A]].traitType } object Main { def main(args: Array[String]) { val a = new Media[String] val b = new Media[Int] println(a.mediaType) println(b.mediaType) } } In the above snippet I show 2 different implementations of the mediaType method (I comment one of them out when compiling the code). However the version using implicitly does not compile? I get the following error message:
impl.scala:19: error: could not find implicit value for parameter e: Trait[A] def mediaType: String = implicitly[Trait[A]].traitType ^ one error found I do understand that there is no implicit value of Trait[A] available. I don't understand why A does not get resolved to the type Media gets instantiated with. I think I'm thinking too much in terms of C++ templates here and I would be very grateful if someone could give me a pointer into the right direction.
Regards, raichoo