所有子类型的隐式处理器



>我有一些类型

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())工作。

相关内容

  • 没有找到相关文章

最新更新