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

为什么scala.util.Failure有一个类型参数?,scala,types,Scala,Types,scala.util.Failure声明如下: final case class Failure[+T](exception: Throwable) extends Try[T]` 它采用一个类型参数T,该参数看起来完全没有必要,因为故障可以很容易地声明为Try[Nothing]的子类型: final case class Failure(exception: Throwable) extends Try[Nothing]` 与None的声明方式相同,如下所示: object None ex

scala.util.Failure
声明如下:

final case class Failure[+T](exception: Throwable) extends Try[T]`
它采用一个类型参数
T
,该参数看起来完全没有必要,因为
故障
可以很容易地声明为
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
如果已将故障声明为
的子类型,请尝试[无任何内容]


我觉得我一定错过了什么。对于type参数,我能想到的唯一原因是声明表达式表示计算特定类型的失败,并明确表示这是一个失败,而不仅仅是使用
Try[T]
,但我无法想象在什么情况下真的需要这样做。
failure[+T]中的
T
在尝试从故障中恢复时很方便:
恢复[U>:T](救援例外:部分功能[Throwable,U]):尝试[U]
在尝试从故障中恢复时,
故障[+T]
中的
T
在尝试从故障中恢复时很方便:
恢复[U>:T](救援例外:部分功能[Throwable,U]):尝试[U]

不太可能,这仍然适用于
失败
子类型
尝试[无]
,同样的
getOrElse
也适用于
。没有
的子类型,扩展而言,在作为
给定的类型参数中没有任何协变类型的子类型。根据定义,
Nothing
是所有类型的子类型。@RandallSchulz:这是不正确的
Option[+A]
的参数是协变的,Option[Nothing]有一个子类型,
None
@wingedsubmariner:当然。。。亚型关系是自反的。我所说的话只有在不具弹性的情况下才是真的。事实并非如此,这仍然适用于
失败
子类型
尝试[什么都不做]
,同样地,
getOrElse
也适用于
None
。不存在
Nothing
的子类型,也不存在任何类型的子类型,这些子类型在作为
Nothing
给定的类型参数中是协变的。根据定义,
Nothing
是所有类型的子类型。@RandallSchulz:这是不正确的
Option[+A]
的参数是协变的,Option[Nothing]有一个子类型,
None
@wingedsubmariner:当然。。。亚型关系是自反的。基本上是同一个问题,但关于
other
:基本上是同一个问题,但关于
other