选项[Serializable]不符合Try [String]

时间:2015-03-13 22:26:20

标签: scala

以下代码生成编译错误Option[serializable] does not conform to Try[String]

在该方法可以返回的所有位置,我将返回Try(String)Failure(Exception)。鉴于编译器为什么认为我要返回Option[Serializable]

def m1(arg1 : String, arg2 : String): Try[String] = {
    for {
      x1 <- getM1(arg1)
      x2 <- getM2(arg2)
    } yield {
      val id : Either[Exception, String]=  weirdFunction(x1, x2)
      id match {
        case Left(e) => Failure(Exception("")))
        case Right(id) => Success(id)
      }
   } getOrElse(Failure(Exception("")))
 }

1 个答案:

答案 0 :(得分:3)

这只是一个括号问题:

def m1(arg1 : String, arg2 : String): Try[String] = {
    for {
      x1 <- getM1(arg1)
      x2 <- getM2(arg2)
    } yield {
      val id : Either[Exception, String]=  weirdFunction(x1, x2)
      id match {
        case Left(e) => Failure(Exception("")))
        case Right(id) => Success(id)
      }
   } /* getOrElse used to be here */
}.getOrElse(Failure(Exception("")))

编译器认为您试图在getOrElse语句中返回的Try上调用yield(如何知道呢?)。由于getOrElse以及Try上存在Option方法,因此这是一个特别令人困惑的错误消息。因此,它认为您试图在id语句的Successyield之后返回Failure。他们最不常见的超类型是Serializable,因为它认为我们仍然包含在for理解中,所以它推断出返回类型为Option[Serializable