Доступ к scala.Не от Java

Как вы можете получить доступ к 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$;

Ответ 1

Это может сработать:

final scala.Option<String> x = scala.Option.apply(null);

def apply [A] (x: A): Опция [A]
 Опция factory, которая создает Некоторые (x), если аргумент не равен NULL, и None, если он равен null.

Ответ 2

Используя Scala 2.10.2 (не уверен, в какой версии, когда это произошло):

final Option<String> none = Option.empty();

Ответ 3

Не ставьте на него слишком тонкую точку, но не следует полагаться на статических экспедиторов, поскольку они могут не создаваться при определенных обстоятельствах. Например, Some не имеет статических пересылок для своего объектного компаньона.

Текущий способ доступа к методам на компаньоне объектов таков:

final scala.Option<String> x = scala.Option$.MODULE$.apply(null);

Option$ - это класс для объекта-компаньона Option. MODULE$ - это окончательное публичное статическое поле, содержащее единственный экземпляр Option$ (другими словами, объект-компаньон).

Ответ 4

Вы можете импортировать

import scala.compat.java8.OptionConverters;

И затем:

OptionConverters.<YourType>toScala(Optional.empty())

Ответ 5

Вы можете сделать следующее (я проверил его, и он отлично подходит для меня с 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

Ответ 6

Используя 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 скомпилировать код при первой попытке. Мне пришлось передать параметр вторичного типа. Теперь он компилируется, просто не спрашивайте