从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在第一次尝试时编译代码。 我必须传递辅助类型参数。 现在它编译,只是不要问