如何为超过 2 个案例确定隐含项的优先级

How to Prioritise Implicits for More than 2 cases

我最近在这里了解到了隐含优先级排序技术:Link

现在,我试图将其推广到隐式数 > 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...
}

在这种情况下,如何强加 Float > 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 成为一个对象而不是 trait

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

Where does Scala look for implicits?

Where does Scala look for implicits?