def withCachedFuture[K, V](key: K)(future: ⇒ Future[V])(implicit cache: Cache[K, Future[V]], ec: ExecutionContext): Future[V] = {
Option(cache getIfPresent key) match {
case Some(result) ⇒
result
case None ⇒
val result = future
cache.put(key, result)
result recover {
case e ⇒
cache.invalidate(key)
throw e
}
}
}
def getCachedOrElsePut[K, V](key: K, default: ⇒ V)(implicit cache: Cache[K, V], system: ActorSystem): V = {
Option(cache getIfPresent key) match {
case None ⇒
val result = default
cache.put(key, result)
result
case Some(v) ⇒ v
}
}
这两个方法从缓存中获取数据,如果找不到数据,它们会存储一个默认值,该值作为参数传递给方法。
第一种方法仅适用于Future
类型,第二种方法适用于除Future
以外的所有类型。我们可以将Future
传递给getCachedOrElsePut
方法,但Future
值可能是Failure
。
如何限制getCachedOrElsePut
方法静态接受Future
以外的所有类型?
答案 0 :(得分:0)
看起来像是另一个问题的重复:Restrict specific type in Scala paramaters?
使用那里的答案你可以限制它:
trait <:!<[A, B]
implicit def nsub[A, B] : A <:!< B = null
implicit def nsubAmbig1[A, B >: A] : A <:!< B = ???
implicit def nsubAmbig2[A, B >: A] : A <:!< B = ???
并将getCachedOrElsePut
的另一个隐含参数添加为ev: V <:!< Future[_]
有关详细信息,建议转到this thread
因此,您将获得编译时检查。 对于运行时,我还建议添加参数的类型检查(因为方法将接受Future转换为Object)例如