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

Другие вопросы по тегам