Возможный дубликат:
Доступ к scala.None из Java
В Java вы можете создать экземпляр Some
с помощью конструктора, то есть new Some(value)
, но None
не имеет класса-партнера. Как вы передаете None
в функцию Scala из Java?
Возможный дубликат:
Доступ к scala.None из Java
В Java вы можете создать экземпляр Some
с помощью конструктора, то есть new Some(value)
, но None
не имеет класса-партнера. Как вы передаете None
в функцию Scala из Java?
Я думаю, этот уродливый бит сработает: scala.None$.MODULE$
Нет необходимости в новом экземпляре, поскольку один None так же хорош, как и другой...
Вещь scala.None$.MODULE$
не всегда проверяет тип, например, это не компилируется:
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();
}
}
Столкнувшись с этим вонючим праздником, мой обычный образ действий таков:
Скала:
object SomeScalaObject {
def it = this
}
Джава:
doStuff(SomeScalaObject.it());