我正在阅读 Scala with Cats 一书。我试图了解 scala 类型系统的微妙之处。我想出了以下示例:
object Example extends App {
sealed trait Serializer[T] {
def serialize(seq: List[T]): String
}
implicit object StringSerializer extends Serializer[String] {
def serialize(seq: List[String]): String = seq.toString()
}
implicit object IntSerializer extends Serializer[Int] {
def serialize(seq: List[Int]): String = seq.toString()
}
def f1[T0 : Serializer](x: List[List[T0]])(implicit s0: Serializer[T0]): List[String] = {
x.map(lst => s0.serialize(lst))
}
// some dummy data
val col1 = List("a", "b", "c", "d", "e")
val col2 = List(12, 200, 80900, 201200, 124420000)
val col3 = List(121, 12121, 71240000, 44356, 845)
val data = List(col1, col2, col3)
f1(data)
}
现在这不编译,出现以下错误:
找不到 Example.Serializer[Any] 类型的证据参数的隐式值
现在我明白为什么会这样了;这是由于我的功能 f1。因为我有一个 List[Int] 和 List[String] 传入函数,所以常见的父类型是 Any。因此类型信息被删除,并传递给序列化程序。
但是,鉴于我已经设置了上下文绑定,编译器不应该在这发生之前先查找隐式定义吗?显然不是这样,所以我的理解是不正确的。解决这个问题的 Scala 方法是什么。
任何解释将不胜感激!