如何为Scala隐式类使用类型参数?

时间:2017-03-14 20:51:36

标签: scala

我想实现期货的重试机制。

例如:

myFuture.map { data =>
   println(data)
   // ... do other stuff
}.recover {
   case e: MyException => logger.error("Something went wrong with XYZ", e)
   case _ => logger.error("Error!")
}.retry(Seq(1.seconds, 10.seconds, 30.seconds))

所以未来应该在一定的时间间隔后重试。

我的实现如下:

import akka.pattern.after
import akka.actor.Scheduler
import scala.concurrent.{ExecutionContext, Future}
import scala.concurrent.duration.FiniteDuration

object FutureExt {

  implicit class FutureUtils(f: Future[T]) {

    def retry[T](delays: Seq[FiniteDuration])(implicit ec: ExecutionContext, s: Scheduler): Future[T] = {
      f recoverWith { case _ if delays.nonEmpty => after(delays.head, s)(f.retry(delays.tail)) }
    }

  }

}

不幸的是,类型参数T无法在隐式类声明中解析。知道这有什么问题吗?

1 个答案:

答案 0 :(得分:3)

这里的隐式类没有什么特别之处。您已在重试方法上指定了类型参数T,但在此之前(在类参数中)引用了它。将类型参数移动到类本身(FutureUtils[T](f: ...))。