Можно ли использовать имплициты для перегрузки методов? - PullRequest
0 голосов
/ 31 января 2019

В следующем примере человек и герой ходят одинаково, но бегут по-разному.

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

...