如何在Scala中定义方法时接受除Future之外的所有类型?

时间:2018-02-17 14:16:16

标签: scala scalaz type-systems

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以外的所有类型?

1 个答案:

答案 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)例如