39

可能重复:
从 Java 访问 scala.None

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

4

5 回答 5

58

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

所以这是获得在更多情况下可用的 None 的另一种方法。

于 2010-09-15T17:12:55.500 回答
26

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

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

于 2010-01-04T04:42:33.923 回答
11

您可以使用以下方法从 java 访问单例 None 实例:

scala.None$.MODULE$
于 2010-01-04T04:46:27.580 回答
3

我发现这个通用函数是最强大的。您需要提供类型参数,但转换只出现一次,这很好。其他一些解决方案在各种情况下都不起作用,因为您的 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();
    }
}
于 2012-10-18T00:44:45.850 回答
1

面对这种恶臭,我通常的作案手法是:

斯卡拉:

object SomeScalaObject {
  def it = this
}

爪哇:

doStuff(SomeScalaObject.it());
于 2010-09-15T17:30:10.843 回答