scala.util.Failure
声明如下:
final case class Failure[+T](exception: Throwable) extends Try[T]`
类型参数T
看起来完全没必要,因为Failure
可以很容易地声明为Try[Nothing]
的子类型:
final case class Failure(exception: Throwable) extends Try[Nothing]`
与声明None
的方式相同:
object None extends Option[Nothing]
实际上,额外的类型参数在其他地方成为痛点。这是Future.zip
:
def zip[U](that: Future[U]): Future[(T, U)] = {
implicit val ec = internalExecutor
val p = Promise[(T, U)]()
onComplete {
case f: Failure[_] => p complete f.asInstanceOf[Failure[(T, U)]]
case Success(s) => that onComplete { c => p.complete(c map { s2 => (s, s2) }) }
}
p.future
}
该行:
case f: Failure[_] => p complete f.asInstanceOf[Failure[(T, U)]]
可以简化为:
case f: Failure => p complete f
如果失败被宣布为Try[Nothing]
的子类型。
我觉得我必须在这里遗漏一些东西。我可以提出类型参数的唯一原因是声明表达式表示计算特定类型的失败,并且明确表示它是一个失败,不像使用Try[T]
,但我可以'想象一下这种情况真的需要。
答案 0 :(得分:5)
T
中的Failure[+T]
在尝试从失败中恢复时派上用场:recover[U >: T](rescueException: PartialFunction[Throwable, U]): Try[U]