我正在做一些关于案例类和类型类的练习。我面临的问题之一是:
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()
}
case class Marker[T: Serializer](lst: Option[List[T]] = None)
Marker() // ambiguous implicit values: here...
}
现在,这会产生有关模棱两可的隐式值的错误。我认为这与我之前提出的问题有关(尽管有不同的错误消息):
Type erasure in a nested list with a given context bound
我纠正了吗,即使错误消息有所不同,它也是在这里工作的同一过程?
答案 0 :(得分:5)
编译器无法推断T
。尝试明确指定T
Marker[String]() // compiles
Marker[Int]() // compiles
当您提供lst
时,它可以推断T
本身
Marker(Some(List(1, 2)))
Marker(Some(List("a", "b")))
出于同样的原因
Marker(Option.empty[List[Int]])
Marker(Option.empty[List[String]])
Marker[Int](None)
Marker[String](None)
Marker(None: Option[List[Int]])
Marker(None: Option[List[String]])
编译而Marker(None)
不编译。
或者,您可以优先选择隐式对象
trait LowPrioritySerializer {
implicit object StringSerializer extends Serializer[String] {
def serialize(seq: List[String]): String = seq.toString()
}
}
object Serializer extends LowPrioritySerializer {
implicit object IntSerializer extends Serializer[Int] {
def serialize(seq: List[Int]): String = seq.toString()
}
}
如果IntSerializer
不起作用(如果类型不同),那么将首先尝试StringSerializer
,然后再次尝试IntSerializer
。