从Java访问scala.None

从Java访问scala.None,java,scala,singleton,scala-java-interop,maybe,Java,Scala,Singleton,Scala Java Interop,Maybe,如何从Java访问scala.None 最后一行导致编译器以“type scala.None不接受参数”结束 这可能会奏效: final scala.Option<String> x = scala.Option.apply(null); final scala.Option x=scala.Option.apply(null); def应用[A](x:A):选项[A] 创建 如果参数不为null,则为Some(x);如果参数为null,则为None 您可以执行以下操作(我对其进

如何从Java访问
scala.None

最后一行导致编译器以“type scala.None不接受参数”结束

这可能会奏效:

final scala.Option<String> x = scala.Option.apply(null);
final scala.Option x=scala.Option.apply(null);
def应用[A](x:A):选项[A]
创建 如果参数不为null,则为Some(x);如果参数为null,则为None

您可以执行以下操作(我对其进行了测试,它在Scala 2.9.1和Java 1.6中运行良好):

final Option obj1=Some.apply(null)//这将给您一个None;
System.out.println(obj1.getClass());//将打印“类scala.None”$
最终选项obj2=Some.apply(“某物”);
System.out.println(obj2.getClass());//将打印“class scala.Some”

不要对它说得太细,但不应该依赖静态转发器,因为它们在某些情况下可能无法生成。例如,
某些
的对象伴侣没有静态转发器

当前访问对象上的方法的方式如下:

final scala.Option<String> x = scala.Option$.MODULE$.apply(null);
final scala.Option x=scala.Option$.MODULE$.apply(null);
选项$
选项
的对象伴生类<代码>模块$是最后一个公共静态字段,其中包含
选项$
的唯一实例(换句话说,是对象伴侣)。

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

final Option none=Option.empty();

使用Scala 2.11.4版在我的案例中唯一有效的方法是

Option<String> maybeAmount = (amount != MISSING_STOCKAMOUNT) 
? Some.apply(amount+"") : Option.<String>apply(null); // can you feel the pain??
不使用类型参数也可以正常工作。由于某种原因,我第一次尝试时无法让Intellij编译代码。我必须传递第二个类型参数。现在它可以编译了,只需不问您是否可以导入

import scala.compat.java8.OptionConverters;
然后:

OptionConverters.<YourType>toScala(Optional.empty())
OptionConverters.toScala(可选的.empty())

当我写这篇文章时,我没有看到@om nom nom发布的答案,但我认为这应该也行。
Some(null)
Some(null)
,而不是
None
。这是我所期望的,因为这是有意义的,这是我通过Scala解释器尝试的结果。但是当我尝试上面在java文件中发布的代码并运行时,我得到obj2.getClass()并没有给我$。但我不知道为什么。当我通过Java执行此操作时,它看起来像是因为某些扩展选项调用了Option的factory apply方法,而如果要应用的参数为null,该方法将返回None。噢,哇,这是我从未想象过的!好的,这里的交易是:Java有静态继承,Scala没有。对象
Some
没有也不能扩展对象
选项
,但Scala会创建从类到对象的静态转发器,除非出现冲突。调用
apply'的正确方法是在
scala.Some$.MODULE$`(或
Option$
等)上执行。恰好
选项
有静态转发器,但
有些
没有,所以Java的静态继承就发挥了作用。太奇怪了,顺便说一下<代码>scala.None$。模块$仍应工作。你有什么问题吗?像java一样可能重复:丑陋但有效你的Scala版本是什么?在Scala 2.11中,它不起作用。@AlvaroAgea在Scala v2.11.7中被选中,就像一个符咒。你能详细解释一下它到底是怎么不起作用的吗?是的,这看起来很痛苦。您使用的是什么版本的Java?Oracle JDK 1.8.0_65
 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
final scala.Option<String> x = scala.Option$.MODULE$.apply(null);
final Option<String> none = Option.empty();
Option<String> maybeAmount = (amount != MISSING_STOCKAMOUNT) 
? Some.apply(amount+"") : Option.<String>apply(null); // can you feel the pain??
Option.apply(null);
import scala.compat.java8.OptionConverters;
OptionConverters.<YourType>toScala(Optional.empty())