Как использовать scala.Некоторые из кода Java

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

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

Ответы

Ответ 1

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

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

Ответ 2

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

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, который можно использовать в других ситуациях.

Ответ 3

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

scala.None$.MODULE$

Ответ 4

Я нашел, что эта универсальная функция является самой надежной. Вам нужно указать параметр типа, но листинг появляется только один раз, что приятно. Некоторые из других решений не будут работать в различных сценариях, как может сообщить ваш компилятор 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();
    }
}

Ответ 5

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

Scala:

object SomeScalaObject {
  def it = this
}

Java:

doStuff(SomeScalaObject.it());