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