Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Java访问scala.None_Java_Scala_Singleton_Scala Java Interop_Maybe - Fatal编程技术网

从Java访问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>(); 这可能会

如何从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>();
这可能会奏效:

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())