如何隐式使用函数?

Fil*_*uca 2 scala implicit

嗨,我读了Debasish关于隐式函数的有趣帖子.我写了这段代码:

def find[C <: Business](id: String) = {
  collection.findOneByID(id).map(x=> implicitly[DBObject => C].apply(x))
}
Run Code Online (Sandbox Code Playgroud)

但它无法使用此编译器消息进行编译:

could not find implicit value for parameter e: (com.mongodb.casbah.commons.Imports.DBObject) => C
Run Code Online (Sandbox Code Playgroud)

我的错是什么?有人可以帮帮我吗?

UPDATE

我的想法是这样的:find是在一个特性中声明的,对DBObject一无所知,我不想把这个依赖.

 trait BusinessRepository {
   def find[C <: Business](id: String): Option[C]
 }

class MongoBusinessRepository {

  val collection = ..

  def find[C <: Business](id: String): Option[C] = {
    collection.findOneByID(id).map(x=> implicitly[DBObject => C].apply(x))         
  }

  implicit def DBObject2Hotel(x: DBObject): Hotel = {
    // ... 
    // returning Hotel
  }
}

case class Hotel(...) extends Business(...)
Run Code Online (Sandbox Code Playgroud)

0__*_*0__ 7

implicitly只是一种查找已知存在的隐式值的便捷方法.因此,当范围中没有这样的隐含值时,它无法编译.

可能的用例是当您使用上下文边界的快捷语法时:

def find[C: Numeric](a: C, b: C): C = implicitly[Numeric[C]].plus(a, b)
Run Code Online (Sandbox Code Playgroud)

当然,在这个例子中,显式形式不那么冗长

def find[C](a: C, b: C)(implicit n: Numeric[C]): C = n.plus(a, b)
Run Code Online (Sandbox Code Playgroud)

您将在此Stackoverflow线程中找到更全面的解释.


我想你用你的方法想到的是相当的

def find[C <: Business](id: String)(implicit fun: DBObject => C) =
  collection.findOneByID(id).map(fun)
Run Code Online (Sandbox Code Playgroud)