如何在Java代码中使用scala.None

时间:2010-01-04 03:56:20

标签: java scala singleton scala-java-interop

  

可能重复:
  Accessing scala.None from Java

在Java中,您可以使用构造函数创建Some的实例,即new Some(value),但None没有合作伙伴类。如何从Java传递None到Scala函数?

5 个答案:

答案 0 :(得分:55)

scala.None$.MODULE$事情并不总是类似于检查,例如这不能编译:

scala.Option<String> x = scala.None$.MODULE$;

因为javac不知道Scala的声明站点方差,所以你得到:

J.java:3: incompatible types
found   : scala.None$
required: scala.Option<java.lang.String>
    scala.Option<String> x = scala.None$.MODULE$ ;

但这确实可以编译:

scala.Option<String> x = scala.Option.apply(null);

这是获得在更多情况下可用的无法的另一种方式。

答案 1 :(得分:22)

我认为这个丑陋的部分会起作用:scala.None$.MODULE$

不需要新的实例,因为一个None和另一个一样好......

答案 2 :(得分:11)

您可以使用以下命令从java访问singleton None实例:

scala.None$.MODULE$

答案 3 :(得分:2)

我发现这个通用函数是最强大的。你需要提供type参数,但是只显示一次,这很好。其他一些解决方案在各种情况下都不起作用,因为您的Java编译器可能会通知您。

import scala.None$;
import scala.Option;

public class ScalaLang {

    public static <T> Option<T> none() {
        return (Option<T>) None$.MODULE$;
    }
}

public class ExampleUsage {
    static {
        //for example, with java.lang.Long
        ScalaLang.<Long>none();
    }
}

答案 4 :(得分:1)

面对这个臭屁股,我通常的作案手法是:

Scala的:

object SomeScalaObject {
  def it = this
}

爪哇:

doStuff(SomeScalaObject.it());