可以使用隐式方法重载吗?

时间:2019-01-31 18:45:47

标签: scala implicit overloading

在下面的示例中,“人类”和“英雄”的走法相同,但运行方式不同。

我的目标是为方法描述提供一个签名,但是对于运行,我希望它的行为取决于类型参数,而在Walk中,我希望它始终保持相同的行为。

trait H
trait Hero extends H
trait Human extends H

trait Move[A <: H] {
  def describe(x: A): Unit
}

class Run[A <: H] extends Move[Hero] {
  def fooWithImplicit[A](x: A)(implicit hRun: A => Unit): Unit = hRun(x)
  def describe(x: A): Unit = fooWithImplicit(x)
}

object Run {
  implicit val heroRun: Hero => Unit = hero => println("I run like a hero")
  implicit val humanRun: Human => Unit = human => println("I run like a human")

}

class Walk[A <: H] extends Move[_] {
  def describe(x: A): Unit = println("we move the same way when we walk")
}

当我尝试运行此函数时,fooWithImplicit(x)仍然需要传递隐式函数,尽管我认为它仅在Run上下文中可用,因为它是在随行对象中定义的。

0 个答案:

没有答案