以下代码生成编译错误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("")))
}
答案 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
语句的Success
或yield
之后返回Failure
。他们最不常见的超类型是Serializable
,因为它认为我们仍然包含在for
理解中,所以它推断出返回类型为Option[Serializable
。