我最近在这里介绍了确定隐式优先级的技术:链接
现在,我试图将其推广到隐式数量> 2 的情况。
从这里的这个答案来看,它说我可以通过创建特征层次结构来做到这一点:链接
以下是我想优先考虑隐式的一些代码:
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()
}
implicit object FloatSerializer extends Serializer[Float] {
def serialize(seq: List[Float]): String = seq.toString()
}
case class Marker[T: Serializer](lst: Option[List[T]] = None)
Marker() // ambiguous implicit values: here...
}
在这种情况下,我如何强加浮点> Int> String 的隐式优先级?
我的尝试如下:
trait A {
implicit object StringSerializer extends Serializer[String] {
def serialize(seq: List[String]): String = seq.toString
}
}
trait B extends A {
implicit object IntSerializer extends Serializer[Int] {
def serialize(seq: List[Int]): String = seq.toString
}
}
trait C extends B {
implicit object FloatSerializer extends Serializer[Float] {
def serialize(seq: List[Float]): String = seq.toString
}
}
但这没有用。查看代码,我可以看到我没有正确执行,但我不确定如何继续。
任何指导将不胜感激。
例如,你可以做
val c = new C {}
import c._
Marker() //compiles
或
object c extends C
import c._
Marker() //compiles
或者使C
成为对象而不是特征
object C extends B {
implicit object FloatSerializer extends Serializer[Float] {
def serialize(seq: List[Float]): Value = ???
}
}
import C._
Marker() //compiles
如果您C
对象并将其重命名为Serializer
(因此C
成为特征Serializer
的配套对象(,那么您将不必进行导入
object Serializer extends B {
implicit object FloatSerializer extends Serializer[Float] {
def serialize(seq: List[Float]): Value = ???
}
}
Marker() //compiles
Scala 在哪里寻找隐式?
Scala 在哪里寻找隐式?