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