Доступ к scala.None из Java
Как вы можете получить доступ scala.None
с Java?
Последняя строка приводит к смерти компилятора с типом scala.None не принимает параметры.
import scala.Option;
import scala.Some;
import scala.None;
final Option<String> object1 = new Some<String>("Hi there");
final Option<String> object2 = new None<String>();
Это приводит к ошибке "не удается найти конструктор символа None()":
final Option<String> object2 = new None();
Это терпит неудачу с "не может найти переменную символа None":
final Option<String> object2 = None;
В 2007 году это работало, но потом Scala изменилась. Компилятор Java дает error: incompatible types
:
final Option<String> object2 = scala.None$.MODULE$;
6 ответов
Это может сработать:
final scala.Option<String> x = scala.Option.apply(null);
def apply [A] (x: A): опция [A]
Фабрика опций, которая создает Some(x), если аргумент не равен нулю, и None, если он равен нулю.
Используя Scala 2.10.2 (не уверен, в какой версии он появился):
final Option<String> none = Option.empty();
Не стоит слишком подчеркивать это, но не следует полагаться на статические пересылки, так как они могут не генерироваться при определенных обстоятельствах. Например, Some
не имеет статических перенаправителей для своего объекта-компаньона.
Текущий способ доступа к методам объекта-компаньона таков:
final scala.Option<String> x = scala.Option$.MODULE$.apply(null);
Option$
это класс для объекта-компаньона Option
, MODULE$
является окончательным открытым статическим полем, которое содержит единственный экземпляр Option$
(другими словами, объект-компаньон).
Вы можете импортировать
import scala.compat.java8.OptionConverters;
А потом:
OptionConverters.<YourType>toScala(Optional.empty())
Вы можете сделать следующее (я протестировал его, и он отлично работает для меня с Scala 2.9.1 и Java 1.6):
final Option<String> obj1 = Some.apply(null) // This will give you a None;
System.out.println(obj1.getClass()); // will print "class scala.None$
final Option<String> obj2 = Some.apply("Something");
System.out.println(obj2.getClass()); //will print "class scala.Some
При использовании Scala версии 2.11.4 единственное, что сработало в моем случае, было
Option<String> maybeAmount = (amount != MISSING_STOCKAMOUNT)
? Some.apply(amount+"") : Option.<String>apply(null); // can you feel the pain??
Обновление: день спустя...
Option.apply(null);
без параметра типа тоже работает, как и должно быть. По какой-то причине я не смог заставить Intellij скомпилировать код с первой попытки. Я должен был передать параметр вторичного типа. Теперь он компилируется, просто не спрашивайте