所有子类型的隐式处理器

时间:2017-08-09 11:26:54

标签: scala covariance implicit

我有一些类型

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())

1 个答案:

答案 0 :(得分:2)

协方差的作用恰恰相反:它意味着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())有效。