Scala 隐式参数未传递给闭包

Scala 隐式参数未传递给闭包,scala,closures,implicit,Scala,Closures,Implicit,我编写了一个小事务助手,它通过闭包并在事务中执行: object Transaction { val emf = Persistence.createEntityManagerFactory("defaultPersistenceUnit") def execute(action: EntityManager => Unit) { val em = emf.createEntityManager() em.getTransaction.begin() a

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

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()
  }
}
然后我有一个
ItemRepository
,如下所示:

object ItemRepository {
  def add(implicit entityManager: EntityManager, item: Item) {
    entityManager.persist(item)
  }
}
object ItemRepository {
  def add(item: Item)(implicit entityManager: EntityManager) {
    entityManager.persist(item)
  }
}
最后,我想执行一个存储库方法,隐式传递EntityManager:

Transaction.execute(implicit em => ItemRepository.add(item))
但是编译器告诉我:

没有足够的参数用于方法add:(隐式entityManager: javax.persistence.EntityManager,隐式项:models.item)单元。 未指定值参数项

如果我显式传递参数,一切都会正常工作:

Transaction.execute(em => ItemRepository.add(em, item))

这里怎么了?隐式修饰符应用于整个参数列表,而不仅仅是一个参数。因此,如果希望entitiyManager参数是隐式的,而item参数不是隐式的,则必须这样编写:

object ItemRepository {
  def add(implicit entityManager: EntityManager, item: Item) {
    entityManager.persist(item)
  }
}
object ItemRepository {
  def add(item: Item)(implicit entityManager: EntityManager) {
    entityManager.persist(item)
  }
}
否则,编译器假定您希望显式地传递整个参数列表,然后抱怨参数太少