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