【发布时间】:2017-10-18 09:36:22
【问题描述】:
scala.util.Failure 声明如下:
final case class Failure[+T](exception: Throwable) extends Try[T]`
考虑到Failure 可以很容易地声明为Try[Nothing] 的子类型,它需要一个看起来完全没有必要的类型参数T:
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],但我无法想象一种情况真正需要的地方。
【问题讨论】:
-
基本相同的问题,但关于
Either:stackoverflow.com/questions/64656786/…