从Java访问scala.None

时间:2012-01-30 04:54:10

标签: java scala singleton scala-java-interop maybe

如何从Java访问scala.None

最后一行会导致编译器死掉“类型scala.None不接受参数”。

import scala.Option;
import scala.Some;
import scala.None;
final Option<String> object1 = new Some<String>("Hi there");
final Option<String> object2 = new None<String>();

失败,“找不到符号构造函数None()”:

final Option<String> object2 = new None();

失败,“无法找到符号变量无”:

final Option<String> object2 = None;

2007年,这曾经发挥作用,但随后Scala发生了变化。 Java编译器提供error: incompatible types

final Option<String> object2 = scala.None$.MODULE$;

6 个答案:

答案 0 :(得分:32)

这可能有效:

final scala.Option<String> x = scala.Option.apply(null);
  

def apply [A](x:A):选项[A]
   创建的Option工厂   如果参数不为null,则为(x),如果为null,则为None。

答案 1 :(得分:16)

使用Scala 2.10.2(不知道何时出现这个版本):

final Option<String> none = Option.empty();

答案 2 :(得分:9)

不要在它上面写太多,但是不应该依赖静态转发器,因为在某些情况下它们可能不会生成。例如,Some没有为其对象伴随的静态转发器。

访问对象伴随的方法的当前方法是:

final scala.Option<String> x = scala.Option$.MODULE$.apply(null);

Option$Option的对象随播广告的类。 MODULE$是一个最终的公共静态字段,它包含Option$的唯一实例(换句话说,对象伴随)。

答案 3 :(得分:1)

您可以导入

import scala.compat.java8.OptionConverters;

然后:

OptionConverters.<YourType>toScala(Optional.empty())

答案 4 :(得分:0)

你可以执行以下操作(我测试了它,对我来说,使用Scala 2.9.1和Java 1.6可以正常工作):

 final Option<String> obj1 = Some.apply(null) // This will give you a None;
 System.out.println(obj1.getClass()); // will print "class scala.None$

 final Option<String> obj2 = Some.apply("Something");
 System.out.println(obj2.getClass()); //will print "class scala.Some

答案 5 :(得分:0)

使用Scala版本2.11.4在我的案例中唯一能解决的问题是

Option<String> maybeAmount = (amount != MISSING_STOCKAMOUNT) 
? Some.apply(amount+"") : Option.<String>apply(null); // can you feel the pain??

更新:一天后......

Option.apply(null);
没有type参数的

也可以正常工作。出于某种原因,我无法让Intellij在第一次尝试时编译代码。我必须传递辅助类型参数。现在它编译,只是不要问