在Scala中为隐式参数隐式转换通用容器

时间:2011-03-11 22:27:32

标签: scala dependency-injection lift implicit-conversion

有没有办法让这项工作? (Scala 2.8.1)

class A
def f(implicit a: A) = 0

class Vendor[T](val v: T)
implicit val vendor = new Vendor(new A)
implicit def vendorToVal[T](implicit v: Vendor[T]) = v.v
f

错误是:'以方法vendorToVal'开头的类型A的隐式扩展分歧

这与Lift 2.2依赖注入有关,实际代码如下所示:

class UserStore(implicit db: DbAccess)
object DependencyFactory extends Factory {
  implicit val db = new FactoryMaker[DbAccess](Model) {}
  import db._ // implicit conversion would allow to remove this import

  implicit val userStore = new FactoryMaker[UserStore](new UserStore) {}
}

此问题与:Is there a way to implicitly convert an implicit parameter in Scala?

有关

2 个答案:

答案 0 :(得分:3)

问题是由vendorToVal方法引起的 - 当我在隐式类型参数化方法中使用隐式参数时,我多次观察到相同的行为。不幸的是,我在2.8 ._。

中找不到简单而优雅的胶水

与主题相关的一些有趣的主题:

  1. http://scala-programming-language.1934581.n4.nabble.com/scala-Why-is-this-a-diverging-implicit-td1998156.html
  2. http://www.scala-lang.org/node/6847

答案 1 :(得分:1)

在Scala 2.9 trunk中,您可以这样做:

scala> class A
defined class A

scala> def f(implicit a: A) = 0
f: (implicit a: A)Int

scala> 

scala> class Vendor[T](val v: T)
defined class Vendor

scala> implicit def value[T: Vendor] = implicitly[Vendor[T]].v
value: [T](implicit evidence$1: Vendor[T])T

scala> implicit val vendor = new Vendor(new A)
vendor: Vendor[A] = Vendor@bbb2d0

scala> f
res0: Int = 0

调用f将搜索类型A的值,并找到隐式value[A],这需要类型为Vendor[A]的证据参数。它将此证据参数解析为vendor

我不认为暗示在2.8.1中是如此强大。