gpt4 book ai didi

scala - 为什么scala.util.Failure具有类型参数?

转载 作者:行者123 更新时间:2023-12-03 07:58:31 24 4
gpt4 key购买 nike

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]的子类型。

我觉得我一定在这里想念什么。我可以为type参数提出的唯一原因是声明一个表达式表示无法计算特定类型,并且明确地表明这是一个失败,这与仅使用 Try[T]不同,但是我无法想象这种情况确实需要。

最佳答案

尝试从故障中恢复时,T中的Failure[+T]会派上用场:recover[U >: T](rescueException: PartialFunction[Throwable, U]): Try[U]

关于scala - 为什么scala.util.Failure具有类型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44049995/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com