lazy val productService = BeanLookup[ProductDataService]
object BeanLookup {
def apply[T](implicit manifest: Manifest[T], context: ActorContext) = {
val beanLookup =
context.actorFor("/user/spring/beanLookup")
Await.result(
(beanLookup.ask(LookupBean(manifest.erasure))(timeout)).mapTo[T](manifest),
timeout.duration) }
def apply[T](implicit manifest: Manifest[T], system: ActorSystem) = {
val beanLookup =
system.actorFor("/user/spring/beanLookup")
Await.result(
(beanLookup.ask(LookupBean(manifest.erasure))(timeout)).mapTo[T](manifest),
timeout.duration) } }
scalac complains :
scala: ambiguous reference to overloaded definition,
both method apply in object BeanLookup of type (implicit manifest: Manifest[com.tooe.core.service.LocationCategoryDataService], implicit system: akka.actor.ActorSystem)com.tooe.core.service.LocationCategoryDataService
and method apply in object BeanLookup of type (implicit manifest: Manifest[com.tooe.core.service.LocationCategoryDataService], implicit context: akka.actor.ActorContext)com.tooe.core.service.LocationCategoryDataService
In short
trait Foo; trait Bar
object Test {
def apply(implicit foo: Foo) {}
def apply(implicit bar: Bar) {}
}
Test.apply // ambiguous
Scala doesn't resolve overloading by figuring out if only one of the two implicits is available.
You should use the magnet pattern if you want overloading in such a case.
object FooOrBar {
implicit def fromFoo(implicit f: Foo) = FooOrBar(Left(f))
implicit def fromBar(implicit b: Bar) = FooOrBar(Right(b))
}
case class FooOrBar(e: Either[Foo, Bar])
object Test {
def apply(implicit i: FooOrBar) = i.e match {
case Left (f) => "foo"
case Right(b) => "bar"
}
}
Test.apply // could not find implicit value for parameter i: FooOrBar
implicit val f = new Foo {}
Test.apply // "foo"
来源:https://stackoverflow.com/questions/17366506/scala-ambiguous-reference-to-overloaded-definition-with-two-implicit-parameters