所有子类型的隐式处理器

Implicit processor for all subtypes

我有一些类型

trait Processor[+A] {
  def handle[B >: A](a: B): Unit
}

trait TypeA

case class A1() extends TypeA

和一个方法

def process[A](a: A)(implicit processor: Processor[A])

我能有类似的东西吗

implicit val processor = new Processor[TypeA] {
  def handle[B >: TypeA](a: B): Unit = {
    println(a)
  }
}

以便它将处理 TypeA 的所有子类型?例如

process(A1())

但在我的例子中它只给出了

scala> process(A1())
<console>:29: error: could not find implicit value for parameter processor: Processor[A1]
              process(A1())

协变的作用恰恰相反:它意味着 Processor[A1]Processor[TypeA],因此一个类型的处理器可以处理它的所有超类型。

因此,如果您需要 Processor 来处理一个类型的所有子类型,则需要逆变。你的特征看起来完全像它实际上应该是逆变的(但这可能是由于问题的简化):

trait Processor[-A] {
  def handle(a: A): Unit
}

implicit val processor: Processor[TypeA] = new Processor[TypeA] {
  def handle(a: TypeA): Unit = {
    println(a)
  }
}

然后 process(A1()) 有效。