2013-07-05 37 views
1

我想写一个函数,它将在未来处理异常并返回新的未来,但我遇到了麻烦,不能使作为签名要求的错误消息斯卡拉类型不匹配:default.type(与底层类型A1 => B1)

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有什么关系?

任何帮助表示赞赏。

P.S.我使用Scala的2.10.1

+0

我不能解释错误消息,但删除显式返回类型可以让你定义函数没有它抱怨 – theon

+0

是的,但返回类型变成scala.concurrent.Future [Any],这不是我想要的 – Zotov

+0

啊,是的,刚才也注意到了。 IntelliJ说谎并且说返回类型是'Future [T]' – theon

回答

3

的问题来自于打字员阶段。如果我们使用-Xprint:打字员,然后我们就可以看到问题:

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也被称为defaultA1 => B1类型。 Here它是在斯卡拉编译器Typer阶段,所以你可以让我猜的票

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]