web-dev-qa-db-ja.com

scala.None from Java codeの使い方

重複の可能性:
Javaからscala.Noneにアクセス

Javaでは、コンストラクターを使用してSomeのインスタンスを作成できます。つまり、new Some(value)ですが、Noneにはパートナークラスがありません。 NoneをJavaのScala関数に渡しますか?

39
Craig B.

この醜いビットはうまくいくと思います:scala.None$.MODULE$

1つのNoneは別のNoneと同じくらい優れているため、新しいインスタンスは必要ありません。

25
Mitch Blevins

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を取得するための別の方法です。

57
Seth Tisue

Javaから:を使用してシングルトンNoneインスタンスにアクセスできます。

scala.None$.MODULE$
11
Randall Schulz

この汎用関数が最も堅牢であることがわかりました。 typeパラメーターを指定する必要がありますが、キャストは1回しか表示されません。これは、Niceです。他のソリューションのいくつかは、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();
    }
}
3
Yuvi Masory

この悪臭に直面して、私の通常の手口は次のとおりです。

Scala:

object SomeScalaObject {
  def it = this
}

Java:

doStuff(SomeScalaObject.it());
1
Alex Cruise