scala - Scala 有没有办法隐式转换隐式参数?

标签 scala dependency-injection 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

实际上我的问题是 Lift 的(2.2)依赖注入(inject),我试图将 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

有什么提示吗?

最佳答案

你差一点就成功了。您只需声明a隐式:

implicit def aToB(implicit a: A) = new B

在这种情况下,编译器尝试为 f 的第一个隐式参数查找一些隐式 B,并找到 aToB。编译器会满足 aToB 的要求(隐式 a: A)并找到您的隐式 val a

关于scala - Scala 有没有办法隐式转换隐式参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5204928/

相关文章:

c# - 如果需要同时批量处理事务和异步执行事务,是否应该将EF6 DbContext作为作用域或临时注入(inject)?

dependency-injection - 如何使用 Ninject 处理具有静态方法的类?

scala - 如何让 sbt 的 Jetty 使用本地域名?

xml - Scala/Lift 中是否(或是否)有 XML 和 JSON 可序列化对象的标准特征?

Scalatest ExecutionContext

string - 如何在scala中获取子字符串?

scala - Akka 调度模式

Scala 类型参数括号

dependency-injection - CDI 1.1中注解的bean发现模式的含义

json - 提升-mongo-记录 : Empty JsonObjectField in mongo collection