Подтвердить что ты не робот

Почему параметр scala.util.Failure имеет параметр типа?

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], но я не могу представить ситуацию где это действительно понадобится.

4b9b3361

Ответ 1

T Failure[+T] пригодится при попытке восстановления после сбоя: recover[U >: T](rescueException: PartialFunction[Throwable, U]): Try[U]