Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 所有子类型的隐式处理器_Scala_Covariance_Implicit - Fatal编程技术网

Scala 所有子类型的隐式处理器

Scala 所有子类型的隐式处理器,scala,covariance,implicit,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 >

我有一些类型

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
的所有子类型?e、 g

process(A1())
但在我的情况下,它只会

scala> process(A1())
<console>:29: error: could not find implicit value for parameter processor: Processor[A1]
              process(A1())
scala>进程(A1())
:29:错误:找不到参数processor:processor[A1]的隐式值
进程(A1())

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

因此,如果您需要一个
处理器
来处理一个类型的所有子类型,那么您需要相反。而你的特质看起来确实应该是相反的(但这可能是由于问题的简化):

然后
过程(A1())
工作

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

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