案例类选项参数的不明确隐式值



我正在经历一些我在案例类和类型类上发明的练习。我遇到的问题之一如下:

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第二次尝试。

最新更新