39

重複の可能性:
scalaにアクセスします。Javaからなし

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

4

5 に答える 5

58

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

于 2010-09-15T17:12:55.500 に答える
26

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

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

于 2010-01-04T04:42:33.923 に答える
11

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

scala.None$.MODULE$
于 2010-01-04T04:46:27.580 に答える
3

このジェネリック関数が最も堅牢であることがわかりました。typeパラメータを指定する必要がありますが、キャストは1回しか表示されないので、便利です。他のソリューションのいくつかは、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();
    }
}
于 2012-10-18T00:44:45.850 に答える
1

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

スカラ:

object SomeScalaObject {
  def it = this
}

Java:

doStuff(SomeScalaObject.it());
于 2010-09-15T17:30:10.843 に答える