Возможный дубликат:
Доступ к scala.Некоторые из Java
В Java вы можете создать экземпляр Some
с помощью конструктора, т.е. new Some(value)
, но None
не имеет класса партнера. Как передать None
функции Scala из Java?
Возможный дубликат:
Доступ к scala.Некоторые из Java
В Java вы можете создать экземпляр Some
с помощью конструктора, т.е. new Some(value)
, но None
не имеет класса партнера. Как передать None
функции Scala из Java?
Я думаю, что этот уродливый бит будет работать: scala.None$.MODULE$
Нет необходимости в новом экземпляре, поскольку один None не хуже другого...
Вещь scala.None$.MODULE$
не всегда имеет тип typecheck, например, это не скомпилируется:
scala.Option<String> x = scala.None$.MODULE$;
потому что javac не знает о Scala дисперсии объявления-сайта, поэтому вы получаете:
J.java:3: incompatible types
found : scala.None$
required: scala.Option<java.lang.String>
scala.Option<String> x = scala.None$.MODULE$ ;
Это компилируется, хотя:
scala.Option<String> x = scala.Option.apply(null);
чтобы другой способ получить None, который можно использовать в других ситуациях.
Вы можете получить доступ к экземпляру singleton None из java, используя:
scala.None$.MODULE$
Я нашел, что эта универсальная функция является самой надежной. Вам нужно указать параметр типа, но листинг появляется только один раз, что приятно. Некоторые из других решений не будут работать в различных сценариях, как может сообщить ваш компилятор Java.
import scala.None$;
import scala.Option;
public class ScalaLang {
public static <T> Option<T> none() {
return (Option<T>) None$.MODULE$;
}
}
public class ExampleUsage {
static {
//for example, with java.lang.Long
ScalaLang.<Long>none();
}
}
Столкнувшись с этим вором, мой обычный способ работы:
Scala:
object SomeScalaObject {
def it = this
}
Java:
doStuff(SomeScalaObject.it());