Java程序如何将值包装到scala.Either?例如,下面的Scala代码将如何用Java编写?
Right("asdf")
Left(new Exception())
以下失败,"找不到符号方法apply(java.lang.String)"
Right.apply("asdf");
以下失败,"找不到符号方法apply(java.lang.Exception)"
Left.apply(new Exception());
答案 0 :(得分:8)
如果我正确理解了这个问题,假设你有以下Scala方法:
def foo(stringOrDate: Either[String, Date]) {
//...
}
您可以通过单个创建Either
子类实例来从Java代码中调用它:
scalaObject.foo(new Left<String, Date>("abc"));
scalaObject.foo(new Right<String, Date>(new Date()));
如果要从Java代码传递函数,则必须根据函数arity实现Function*
特性:
def foo(stringOrStringFun: Either[String, () => String]) {
//...
}
在Java中:
scalaObject.foo(new Left<String, scala.Function0<String>>("abc"));
scalaObject.foo(new Right<String, scala.Function0<String>>(
new scala.Function0<String>() {
@Override
public String apply() {
throw new RuntimeException();
}
}));
当然在Scala中它更简单,因为它在语法级别支持lambdas:
foo(Left("abc"))
foo(Right(throw new RuntimeException()))