gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 03:33:01 27 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] 的子类型。

我觉得我一定错过了一些东西。我可以提出类型参数的唯一原因是声明一个表达式表示计算特定类型的失败,并且明确地表明它是失败,这与仅使用 Try[T] 不同,但我无法想象真正需要这样做的情况。

最佳答案

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

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

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