如果我没有显式实例化foo
函数的特定于类型的版本,则对formatFromString
的调用会产生下面的编译器错误。但是,在bar
情况下,编译器能够推导出正确的隐式参数。
为什么?
import play.api.libs.json.{Reads, Writes, Json}
case class Person(name: String, age: Int)
object Person { implicit val jsonFormat = Json.format[Person] }
def foo[T](input: String)(implicit fromS: String => T): T = fromS("")
def bar[T](input: T)(implicit toS: T => String): String = ""
implicit def formatFromString[T : Reads](s: String): T = Json.parse(s).validate[T].get
implicit def formatToString[T : Writes](x: T): String = Json.toJson(x).toString
// If I uncomment this line, everything works ...
// implicit val personFromString = formatFromString[Person] _
foo[Person]("")
bar(Person("Peter", 1234))
编译错误:
错误:(18,13)String =>中没有可用的隐式视图人。 fooPerson ^