为什么我打字的时候一切都很好?
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的成员 ( RightString,Int.left getOrElse RightString,Int.left getOrElse LeftString,Int)
所以我不能链接getOrElse方法调用
发布于 2013-08-21 20:31:35
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,这是一个更常见的用例。)
如果将其作为一种扩展方法,使用becomes,这在语法上就变得更有用了。
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)https://stackoverflow.com/questions/18366801
复制相似问题