隐式参数不会传递给闭包

dea*_*mon 2 closures scala implicit

我写了一个小事务助手,它传递了一个闭包并在事务中执行它:

object Transaction {

  val emf = Persistence.createEntityManagerFactory("defaultPersistenceUnit")

  def execute(action: EntityManager => Unit) {
    val em = emf.createEntityManager()
    em.getTransaction.begin()
    action(em)
    em.getTransaction.commit()
    em.close()
  }
}
Run Code Online (Sandbox Code Playgroud)

然后我ItemRepository就是这样的:

object ItemRepository {
  def add(implicit entityManager: EntityManager, item: Item) {
    entityManager.persist(item)
  }
}
Run Code Online (Sandbox Code Playgroud)

最后,我想要隐式传递的EntityManager执行存储库方法:

Transaction.execute(implicit em => ItemRepository.add(item))
Run Code Online (Sandbox Code Playgroud)

但是编译器告诉我:

没有足够的方法添加参数:(隐式实体管理器:javax.persistence.EntityManager,隐含项:models.Item)单位.未指定的值参数项.

如果我显式传递参数,一切都有效:

Transaction.execute(em => ItemRepository.add(em, item))
Run Code Online (Sandbox Code Playgroud)

这有什么不对?它看起来与这个答案几乎相同.

Kim*_*bel 7

隐式修饰符适用于整个参数列表,而不仅仅适用于一个参数.因此,如果您希望entitiyManager参数是隐式的并且item参数不是隐式的,则必须像这样写:

object ItemRepository {
  def add(item: Item)(implicit entityManager: EntityManager) {
    entityManager.persist(item)
  }
}
Run Code Online (Sandbox Code Playgroud)

否则,编译器假定您要显式传递整个参数列表,然后抱怨参数太少.