我正在经历一些我在案例类和类型类上发明的练习。我遇到的问题之一如下:
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...
}
现在,这给出了一个关于不明确隐式值的错误。我认为这与我之前问过的一个问题有关(尽管是不同的错误消息(:
在具有给定上下文绑定的嵌套列表中键入擦除
我是否正确,即使错误消息不同,这里的工作过程也相同?
编译器无法推断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
将首先尝试,如果IntSerializer
不起作用(如果类型不同(,则将StringSerializer
第二次尝试。