【发布时间】:2011-03-05 15:59:25
【问题描述】:
有没有办法使这项工作(Scala 2.8.1):
class A
class B
def f(implicit b: B) {}
implicit val a = new A
implicit def aToB(a: A) = new B
f(a) // works ok
f // error: could not find implicit value for parameter b: B
实际上我的问题在于 Lift (2.2) 的依赖注入,我正在尝试将 Vendor[T] 转换为 T 并在类构造函数中隐式要求它,而不在每个 val 之后添加导入:
object DependencyFactory extends Factory {
implicit def vendorToVal[T](vendor: Vendor[T]): T = vendor.vend
implicit val db = new FactoryMaker[DbAccess](Model) {}
//uncommenting the following line makes it work, but can we avoid it?
//import db._
implicit val userStore = new FactoryMaker[UserStore](new UserStore) {}
}
UserStore 在哪里:
class UserStore(implicit db: DbAccess)
我做错了吗?
更新
感谢Easy Angel回答第一部分。但它并没有解决我的 Lift DI 问题,因为事实证明,范围内存在相反的转换(从 T 到 Vendor[T]),并且这两者都会导致“错误:发散隐式扩展”。
可以解决吗?
更新2
哇,在上一个问题之后又出现了一个问题:从某个 Container[T] 到 T 的转换在范围内具有 Container[U] 的隐式实例,并且一个具有隐式参数 U 的函数也会导致“发散隐式扩展”:
class A
case class Vendor[T](v: T)
def f(implicit a: A) {}
implicit val vendor = Vendor(new A)
implicit def vendorToVal[T](implicit v: Vendor[T]) = v.v
f
有什么提示吗?
【问题讨论】:
-
关于 Update2... 我尝试使用
-Xlog-implicits选项运行编译器,在我看来,编译器无法正确推断 T。例如,如果你写implicit def vendorToVal(implicit v: Vendor[A]): A = v.v,它将编译。但我仍然不确定......我也很高兴知道它无法编译的原因。我认为这本身就值得质疑。所以我建议你用Update2创建新问题。
标签: scala dependency-injection lift implicit-conversion