Доступ к scala.None из Java - PullRequest
       19

Доступ к scala.None из Java

23 голосов
/ 30 января 2012

Как получить доступ к 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 ]

32 голосов
/ 30 января 2012

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

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

def apply [A] (x: A): опция [A]
Фабрика опций, которая создает Some (x), если аргумент не равен NULL, и None, если он равен NULL.

16 голосов
/ 14 ноября 2013

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

final Option<String> none = Option.empty();
9 голосов
/ 01 февраля 2012

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

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

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

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

1 голос
/ 08 мая 2017

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

import scala.compat.java8.OptionConverters;

А затем:

OptionConverters.<YourType>toScala(Optional.empty())
0 голосов
/ 08 сентября 2016

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

0 голосов
/ 30 января 2012

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