为什么当我输入时一切正常?
Right(2).left getOrElse Right(4).left getOrElse Left("Error")
但是当我键入此编译失败?
Right[String, Int](2).left getOrElse Right[String, Int](4).left getOrElse Left[String, Int]("Error")
编译错误:
值getOrElse不是java.io.Serializable的成员
println(RightString,Int.left getOrElse RightString,
Int.left getOrElse LeftString,Int)
所以我不能链接
getOrElse
方法调用 最佳答案
getOrElse
的LeftProjection[A, B]
签名为:
def getOrElse[AA >: A](or: ⇒ AA): AA
即它期望参数为
AA
类型,它是A
的超类型。在第一个示例中,您省略了类型注释,从而允许编译器为
Nothing
推断A
。然后,您提供了一个LeftProjection[Nothing, Int]
类型的参数。因为
Nothing
是所有类型的子类型,所以LeftProjection[Nothing, Int]
显然是超类型!类型系统中的这种特殊情况意味着它几乎是偶然地进行了类型检查。但是,
String
和LeftProjection[String, Int]
的最特定的通用超类型是Serializable
。因此,如果要链接
Either
,则需要一个可以采用其他Either[A, B]
的方法,而不仅仅是A
或B
。您似乎想要的方法如下所示:
def leftOrElse[A, B](e1: Either[A, B], e2: => Either[A, B]): Either[A,B] =
e1 match {
case Left(a) => Left(a)
case Right(b) => e2
}
(您可以类似地编写
rightOrElse
,这是一个更常见的用例。)如果使用隐式扩展方法,将其在语法上变得更加有用。
implicit class EitherOps[A, B](e1: Either[A, B]) {
def leftOrElse(e2: => Either[A, B]): Either[A,B] = // as above
}
因为这期望两个操作数都使用
Either[A, B]
,而不是A
或B
(或其某些超类型),所以可以链接Either
。scala> Right[String, Int](2) leftOrElse Right[String, Int](4) leftOrElse Left[String, Int]("Error")
res1: Either[String,Int] = Left(Error)
关于scala - Scala.getOrElse方法之一,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18366801/