有没有办法在Scala中隐式转换隐式参数?

Ole*_*ako 2 dependency-injection scala lift implicit-conversion

有没有办法使这项工作(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
Run Code Online (Sandbox Code Playgroud)

其实我的问题是与Lift的(2.2)的依赖注入,我试图给供应商[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) {}
}
Run Code Online (Sandbox Code Playgroud)

在哪里UserStore:

class UserStore(implicit db: DbAccess)
Run Code Online (Sandbox Code Playgroud)

难道我做错了什么?

UPDATE

感谢Easy Angel回答第一部分.但它并没有解决我的Lift DI问题,因为事实证明在范围内(从T到Vendor [T])存在相反的转换,并且两者都导致'错误:分歧隐式扩展'.

可以解决吗?

UPDATE2

之前又遇到了一个问题:从一些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
Run Code Online (Sandbox Code Playgroud)

任何提示?

ten*_*shi 5

你几乎成功了.您只需要声明a隐式:

implicit def aToB(implicit a: A) = new B
Run Code Online (Sandbox Code Playgroud)

在这种情况下,编译器试图找到一些隐性B的第一隐含参数f和发现aToB.比编译器关系满足aToB的要求(implicit a: A)并找到你的implicit val a.