可能重复:
从 Java 访问 scala.None
在Java 中,您可以创建一个Some
使用构造函数的实例,即new Some(value)
,但None
没有伙伴类。如何None
从 Java 传递给 Scala 函数?
可能重复:
从 Java 访问 scala.None
在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 和另一个一样好......
您可以使用以下方法从 java 访问单例 None 实例:
scala.None$.MODULE$
我发现这个通用函数是最强大的。您需要提供类型参数,但转换只出现一次,这很好。其他一些解决方案在各种情况下都不起作用,因为您的 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
}
爪哇:
doStuff(SomeScalaObject.it());