从Java访问scala.None
你怎么能从Java访问scala.None
?
最后一行导致编译器死于“类型scala.None不接受参数”。
import scala.Option; import scala.Some; import scala.None; final Option object1 = new Some("Hi there"); final Option object2 = new None();
这失败了“无法找到符号构造函数None()”:
final Option object2 = new None();
这失败了“找不到符号变量无”:
final Option object2 = None;
在2007年,这曾经工作,但随后Scala改变了。 Java编译器给出error: incompatible types
:
final Option object2 = scala.None$.MODULE$;
这可能有效:
final scala.Option x = scala.Option.apply(null);
def apply [A](x:A):选项[A]
Option参数工厂,如果参数不为null,则创建Some(x);如果为null,则创建None。
使用Scala 2.10.2(不确定它出现时的版本):
final Option none = Option.empty();
不要过分细微,但不应该依赖静态转发器,因为在某些情况下它们可能无法生成。 例如, Some
的对象伴侣没有静态转发器。
访问对象伴随方法的当前方法是:
final scala.Option x = scala.Option$.MODULE$.apply(null);
Option$
是Option$
对象伴侣的类。 MODULE$
是一个最终的公共静态字段,它包含Option$
的唯一实例(换句话说,对象伴随)。
你可以导入
import scala.compat.java8.OptionConverters;
接着:
OptionConverters.toScala(Optional.empty())
您可以执行以下操作(我测试了它,它适用于我使用Scala 2.9.1和Java 1.6):
final Option obj1 = Some.apply(null) // This will give you a None; System.out.println(obj1.getClass()); // will print "class scala.None$ final Option obj2 = Some.apply("Something"); System.out.println(obj2.getClass()); //will print "class scala.Some
使用Scala版本2.11.4在我的案例中唯一能解决的问题是
Option maybeAmount = (amount != MISSING_STOCKAMOUNT) ? Some.apply(amount+"") : Option. apply(null); // can you feel the pain??
更新:一天后……
Option.apply(null);
没有类型参数也可以正常工作。 出于某种原因,我无法让Intellij在第一次尝试时编译代码。 我必须传递辅助类型参数。 现在它编译,只是不要问