从Java访问scala.None
如何从Java访问scala.None 最后一行导致编译器以scala类型终止。None不接受参数从Java访问scala.None,java,scala,singleton,scala-java-interop,maybe,Java,Scala,Singleton,Scala Java Interop,Maybe,如何从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>(); 这可能会
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>();
这可能会奏效:
final scala.Option<String> x = scala.Option.apply(null);
def应用[A]x:A:选项[A]
创建
如果参数不为null,则为Somex;如果参数为null,则为None
您可以执行以下操作,我对其进行了测试,它在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
不要说得太过分,但不应该依赖静态转发器,因为它们在某些情况下可能无法生成。例如,有些没有对象伴侣的静态转发器 当前访问对象上的方法的方式如下:
final scala.Option<String> x = scala.Option$.MODULE$.apply(null);
Option$是Option对象的类。模块$是一个最终的公共静态字段,其中包含选项$的唯一实例,换句话说,就是对象伴侣。使用Scala 2.10.2时,不确定它出现在哪个版本:
final Option<String> 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())
当我写这篇文章时,我没有看到@om nom nom张贴的答案,但我认为这也应该有效。Somenull是Somenull,而不是None。这是我所期望的,因为这是有意义的,这就是我通过Scala解释器尝试的结果。但是,当我尝试上面在java文件中发布的代码并运行时,我得到obj2.getClass,没有给我$。但我不知道为什么。当我通过Java执行此操作时,它看起来像是因为某些扩展选项调用了Option的factory apply方法,而如果要应用的参数为null,该方法将返回None。噢,哇,这是我从未想象过的!好的,这里的交易是:Java有静态继承,Scala没有。对象没有也不能扩展对象选项,但是Scala会创建从类到对象的静态转发器,除非出现冲突。调用apply'的正确方法是在scala上执行。有些$.MODULE$`或Option$等。碰巧Option有静态转发器,但有些没有,所以Java的静态继承就发挥了作用。太奇怪了,顺便说一下。。。scala.None$.MODULE$仍应工作。你有什么问题吗?像java一样可能重复:丑陋但有效你的Scala版本是什么?在Scala 2.11中,它不起作用。@AlvaroAgea在Scala v2.11.7中被选中,就像一个符咒。你能详细解释一下它到底是怎么不起作用的吗?是的,这看起来很痛苦。您使用的是什么版本的Java?Oracle JDK 1.8.0_65
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())