Как использовать scala.None из кода Java

Возможный дубликат:
Доступ к scala.None из Java

В Java вы можете создать экземпляр Some с помощью конструктора, то есть new Some(value), но None не имеет класса-партнера. Как вы передаете None в функцию Scala из Java?


person Craig B.    schedule 04.01.2010    source источник


Ответы (5)


Я думаю, этот уродливый бит сработает: scala.None$.MODULE$

Нет необходимости в новом экземпляре, поскольку один None так же хорош, как и другой...

person Mitch Blevins    schedule 04.01.2010
comment
один None так же хорош, как другой. Слоган для языка scala? - person WestCoastProjects; 26.07.2019

Вещь scala.None$.MODULE$ не всегда проверяет тип, например, это не компилируется:

scala.Option<String> x = scala.None$.MODULE$;

потому что javac не знает о дисперсии сайта объявления Scala, поэтому вы получаете:

J.java:3: incompatible types
found   : scala.None$
required: scala.Option<java.lang.String>
    scala.Option<String> x = scala.None$.MODULE$ ;

Однако это компилируется:

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

так что это другой способ получить None, который можно использовать в большем количестве ситуаций.

person Seth Tisue    schedule 15.09.2010
comment
Мне даже пришлось написать scala.Option.apply((String) null), чтобы сделать компилятор счастливым. - person Eric; 17.05.2012
comment
Спасибо! Это сработало для меня, в то время как scala.None$.MODULE$ выдавал ошибки типа. - person Daniel Cannon; 25.01.2016

Вы можете получить доступ к экземпляру singleton None из java, используя:

scala.None$.MODULE$
person Randall Schulz    schedule 04.01.2010

Я нашел эту общую функцию наиболее надежной. Вам нужно указать параметр типа, но приведение появляется только один раз, что хорошо. Некоторые другие решения не будут работать в различных сценариях, как может сообщить вам ваш компилятор Java.

import scala.None$;
import scala.Option;

public class ScalaLang {

    public static <T> Option<T> none() {
        return (Option<T>) None$.MODULE$;
    }
}

public class ExampleUsage {
    static {
        //for example, with java.lang.Long
        ScalaLang.<Long>none();
    }
}
person Yuvi Masory    schedule 18.10.2012
comment
Спасибо, это один из более чистых вариантов. Очевидно, что вызов кода Scala из Java иногда не оптимален. :( - person Per Lundberg; 05.03.2020

Столкнувшись с этим вонючим праздником, мой обычный образ действий таков:

Скала:

object SomeScalaObject {
  def it = this
}

Джава:

doStuff(SomeScalaObject.it());
person Alex Cruise    schedule 15.09.2010