1

我正在尝试编写一个函数来处理将来的异常并返回新的未来,但是我遇到了麻烦并且无法理解错误消息

scala> def composeHandlingFuture[T](fut: Future[T], default: T): Future[T] =
     | fut recover { case e: Exception => default }
<console>:19: error: type mismatch;
 found   : default.type (with underlying type A1 => B1)
 required: T
       fut recover { case e: Exception => default }
                                          ^

default.type等于T签名要求吗?和它有什么关系type A1 => B1

任何帮助表示赞赏。

PS我正在使用Scala 2.10.1

4

2 回答 2

3

问题来自打字机阶段。如果我们使用 -Xprint:typer 那么我们可以看到问题:

def composeHandlingFuture[T >: Nothing <: Any](fut: scala.concurrent.Future[T], default: T): scala.concurrent.Future[T] = fut.recover[T](({
      @SerialVersionUID(0) final <synthetic> class $anonfun extends scala.runtime.AbstractPartialFunction[Throwable,T] with Serializable {
        /////// Init method //////

        final override def applyOrElse[A1 >: Nothing <: Throwable, B1 >: T <: Any](x1: A1, default: A1 => B1): B1 = ((x1.asInstanceOf[Throwable]: Throwable): Throwable @unchecked) match {
          case (e @ (_: Exception)) => <error: value default> // your argument comes here, but name clash happens
          case (defaultCase$ @ _) => default.apply(x1)
        };


        //// IsDefinedAt method ////
  }

问题出在 PartialFunction 中,aplyOrElse 的第二个参数也default用 type调用A1 => B1是在 Scala 编译器 Typer 阶段,所以我猜你可以开票

于 2013-07-05T08:46:22.387 回答
0

奇怪,只要我重命名default变量,一切都编译得很好:

scala> def composeHandlingFuture[T](fut: Future[T], x: T): Future[T] =
     | fut recover { case e: Exception => x }
composeHandlingFuture: [T](fut: scala.concurrent.Future[T], x: T)scala.concurrent.Future[T]
于 2013-07-05T08:13:09.967 回答