【问题标题】:Implicit conversion of a generic container for an implicit parameter in ScalaScala中隐式参数的通用容器的隐式转换
【发布时间】:2011-03-11 22:27:32
【问题描述】:

有没有办法让这个工作? (斯卡拉 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?

【问题讨论】:

标签: scala dependency-injection lift implicit-conversion


【解决方案1】:

问题是由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

【讨论】:

    【解决方案2】:

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

    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 中没有那么强大。

    【讨论】:

    • 在我的 2.9.0 版本中,当我将另一个类的隐式 Vendor 添加到同一上下文时,它会中断:class B; implicit val vendor_b = new Vendor(new B)
    • 是的。在那种情况下,我想仍然可以写f(value[A]),但这超出了意义..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多