在下面的示例中,“人类”和“英雄”的走法相同,但运行方式不同。
我的目标是为方法描述提供一个签名,但是对于运行,我希望它的行为取决于类型参数,而在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上下文中可用,因为它是在随行对象中定义的。