我有一些类型
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())
答案 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())
有效。