所有子类型的隐式处理器
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())
有效。
我有一些类型
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())
有效。