28

如何scala.None从 Java 访问?

最后一行导致编译器因“type 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$;
4

6 回答 6

36

这可能有效:

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

def apply [A] (x: A): Option[A]
如果参数不为 null,则创建 Some(x),如果为 null,则创建 None。

于 2012-01-30T05:21:06.893 回答
17

使用 Scala 2.10.2(不确定这是什么版本):

final Option<String> none = Option.empty();
于 2013-11-14T02:20:55.243 回答
9

不要太强调这一点,但不应依赖静态转发器,因为它们可能不会在某些情况下生成。例如,Some它的对象伴侣没有静态转发器。

当前访问对象伴侣上的方法的方式是:

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

Option$是 的对象伴侣的类OptionMODULE$是一个最终的公共静态字段,包​​含Option$(换句话说,对象伴侣)的唯一实例。

于 2012-02-01T14:14:51.870 回答
1

你可以导入

import scala.compat.java8.OptionConverters;

接着:

OptionConverters.<YourType>toScala(Optional.empty())
于 2017-05-08T16:05:45.020 回答
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
于 2012-01-30T05:29:44.730 回答
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);

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

于 2016-09-08T01:51:29.523 回答