3

我有一个具有以下签名的 scala 函数:

def getValue: Validation[ Throwable, String ]

现在,我想用 Java 处理res调用这个函数的结果(比如说)。

我可以打电话res.isSuccess()res.isFailure()但我如何提取基础Throwable或成功String

我尝试铸造,但(res instanceof scalaz.Failure)在 a 中测试结果scalaz.Failure cannot be resolved to a type(可见 scala 和 scalaz jars)

有没有一种通用的方法来为Validation, Option, Either, 等等...?

编辑我意识到我可能可以使用 afold但这会导致 Java 中出现很多丑陋的样板代码(不需要更多)。有更好看的吗?

4

1 回答 1

4

Success并且Failure都是案例类:

final case class Success[E, A](a: A) extends Validation[E, A]
final case class Failure[E, A](e: E) extends Validation[E, A]

因此,您可以编写以下内容,例如:

import scalaz.*;

public class Javaz {
  public static void main(String[] args) {
    Validation<Throwable, String> res = new Success<Throwable, String>("test");

    if (res.isSuccess()) {
      System.out.println(((Success) res).a());
    } else {
      System.out.println(((Failure) res).e());
    }
  }
}

ForOptionEither您可以使用该get方法(在 的情况下采用leftorright投影后Either)。

不过,如果可能的话fold,在 Scala 端使用 等进行这种展开可能会更干净。

于 2012-12-08T12:23:16.963 回答