Если я правильно понимаю вопрос, предположим, что у вас есть следующий метод Scala:
def foo(stringOrDate: Either[String, Date]) {
//...
}
Вы можете вызвать его из кода Java, создав единственные экземпляры Either
подклассов:
scalaObject.foo(new Left<String, Date>("abc"));
scalaObject.foo(new Right<String, Date>(new Date()));
Если вы хотите передать функции из кода Java, вы должны реализовать черту 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 намного проще, поскольку поддерживает лямбды на уровне синтаксиса:
foo(Left("abc"))
foo(Right(throw new RuntimeException()))