Ответ 1
Это может сработать:
final scala.Option<String> x = scala.Option.apply(null);
def apply [A] (x: A): Опция [A]
Опция factory, которая создает Некоторые (x), если аргумент не равен NULL, и None, если он равен null.
Как вы можете получить доступ к scala.None
из Java?
Последняя строка заставляет компилятор умирать с "type 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$;
Это может сработать:
final scala.Option<String> x = scala.Option.apply(null);
def apply [A] (x: A): Опция [A]
Опция factory, которая создает Некоторые (x), если аргумент не равен NULL, и None, если он равен null.
Используя 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);
без параметра type тоже работает, как и должно быть. По какой-то причине я не смог заставить Intellij скомпилировать код при первой попытке. Мне пришлось передать параметр вторичного типа. Теперь он компилируется, просто не спрашивайте