从Java访问scala.None

Mik*_*inn 26 java singleton scala maybe scala-java-interop

你怎么scala.None能从Java 访问?

最后一行导致编译器死于"类型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>();
Run Code Online (Sandbox Code Playgroud)

这失败了"无法找到符号构造函数None()":

final Option<String> object2 = new None();
Run Code Online (Sandbox Code Playgroud)

这失败了"无法找到符号变量无":

final Option<String> object2 = None;
Run Code Online (Sandbox Code Playgroud)

在2007年,这曾经工作,但随后Scala改变了.Java编译器给出error: incompatible types:

final Option<String> object2 = scala.None$.MODULE$;
Run Code Online (Sandbox Code Playgroud)

om-*_*nom 34

这可能有效:

final scala.Option<String> x = scala.Option.apply(null);
Run Code Online (Sandbox Code Playgroud)

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

  • 就像java:丑陋但有效 (5认同)

Dav*_*ten 16

使用Scala 2.10.2(不确定它何时出现的版本):

final Option<String> none = Option.empty();
Run Code Online (Sandbox Code Playgroud)


Dan*_*ral 9

不要过分夸大它,但不应该依赖静态转发器,因为在某些情况下它们可能无法生成.例如,Some它的对象伴侣没有静态转发器.

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

final scala.Option<String> x = scala.Option$.MODULE$.apply(null);
Run Code Online (Sandbox Code Playgroud)

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