嗨,我读了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)
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)