可能重复:
从Java访问scala.None
在Java中,您可以创建Some使用构造函数的实例,即new Some(value),但None没有合作伙伴类.你如何None从Java 传递给Scala函数?
在上一个问题中,从Java访问scala.None,似乎人们已经习惯javap了解如何scala.None从Java 访问.我想知道他们是怎么做到的.仅供参考,答案是:
scala.Option$.MODULE$.apply(null);
Run Code Online (Sandbox Code Playgroud)
可以缩短为:
scala.Option.apply(null);
Run Code Online (Sandbox Code Playgroud)
鉴于此计划(OptionTest.scala):
object OptionTest extends App {
val x = scala.None
val y = scala.Some("asdf")
}
Run Code Online (Sandbox Code Playgroud)
我这样跑javap了:
javap -s -c -l -private OptionTest
Run Code Online (Sandbox Code Playgroud)
这是javap输出的一部分:
public static final scala.None$ x();
Signature: ()Lscala/None$;
Code:
0: getstatic #11; //Field OptionTest$.MODULE$:LOptionTest$;
3: invokevirtual #55; //Method OptionTest$.x:()Lscala/None$;
6: areturn
Run Code Online (Sandbox Code Playgroud)
我也javap的上运行scala.None和scala.Option.如何从javap输出中找出:
None是唯一None.type延伸的类型的对象Optionapply()伴侣对象的方法是必需的?
与我之前的问题相同的想法,只是更高级一点。我想用 Java 编写以下 Scala 代码:
Option(System.getProperty("not.present")).orElse(Some("default")).get
Run Code Online (Sandbox Code Playgroud)
我试过这个:
final Function0<Option<String>> elseOption = new Function0<Option<String>>() {
@Override public Option<String> apply() {
return new Some<String>("default");
}
};
final Option<String> notPresent =
new Some<String>(System.getProperty("not.present")).
orElse(elseOption).get();
Run Code Online (Sandbox Code Playgroud)
但我得到:
<anonymous OptionDemo$1> is not abstract and does not override abstract method apply$mcD$sp() in scala.Function0
[error] orElse(new Function0<Option<String>>() {
Run Code Online (Sandbox Code Playgroud)