В следующем примере человек и герой ходят одинаково, но бегут по-разному.
Моя цель - иметь одну сигнатуру для описания метода, но для запуска я хочу, чтобы он вел себя по-разному в зависимости от параметра типа, а в 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, потому что это определено в объекте-компаньоне.