I was trying to workout the classic example of converting arbitrary values into their Json representation and having compile time errors in case conversion is not defined.
So far, I have,
trait Json trait ConvertableToJson[A] { def toJson: Json } object Json { case class Str(str: String) extends Json case class Int(int : Int) extends Json case class StrToJson(s: String) extends ConvertableToJson[StrToJson] { override def toJson: Json = Str(s) } } implicit def str2Json(s: String): StrToJson = StrToJson(s) def toJson[A <: ConvertableToJson[A]](a: A) = a.toJson println(toJson("some string")) I expected the above code to work like:
toJson("some string") to fail to compile without the implicit def. Because String <: ConvertableToJson[String] is false.
But then to use, the implicit def and find Str2Json.
Str2Json <: ConvertableToJson[Str2Json] should be true.
However, this doesn't happen and compiler complains:
Error: Inferred type arguments [String] do not conform to method toJson's type parameter bounds [A <: scalaz.ConvertToJson.ConvertableToJson[A]] println(toJson("dhruv")) ^ It'll be great if someone can help me correct my understanding