案例类别选项参数的隐式隐含值

时间:2020-07-01 14:45:13

标签: scala types optional typeclass

我正在做一些关于案例类和类型类的练习。我面临的问题之一是:

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

我纠正了吗,即使错误消息有所不同,它也是在这里工作的同一过程?

1 个答案:

答案 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

相关问题