重複の可能性:
scalaにアクセスします。Javaからなし
Javaでは、コンストラクターを使用するインスタンスを作成できます。Some
つまりnew Some(value)
、None
パートナークラスはありません。None
JavaからScala関数にどのように渡しますか?
重複の可能性:
scalaにアクセスします。Javaからなし
Javaでは、コンストラクターを使用するインスタンスを作成できます。Some
つまりnew Some(value)
、None
パートナークラスはありません。None
JavaからScala関数にどのように渡しますか?
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を取得するための別の方法です。
私はこの醜いビットがうまくいくと思います:scala.None$.MODULE$
あるNoneは別のNoneと同じくらい優れているので、新しいインスタンスは必要ありません...
以下を使用して、JavaからシングルトンNoneインスタンスにアクセスできます。
scala.None$.MODULE$
このジェネリック関数が最も堅牢であることがわかりました。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();
}
}
この悪臭に直面して、私の通常の手口は次のとおりです。
スカラ:
object SomeScalaObject {
def it = this
}
Java:
doStuff(SomeScalaObject.it());