2010-01-04 101 views

回答

19

我觉得这丑陋位将工作:scala.None$.MODULE$

没有必要为一个新实例,因为一个都不是另一个好...

10

您可以从Java中使用访问单身无实例:

scala.None$.MODULE$ 
49

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

所以这是一个不同的方式来获得无那在更多情况下可用。

+8

我甚至不得不编写“scala.Option.apply((String)null)”来使编译器很高兴。 – Eric 2012-05-17 00:59:26

+1

谢谢!这对我有用,而scala.None $ .MODULE $产生类型错误。 – 2016-01-25 18:24:55

1

与此stinkfest面前,我一贯的手法是:

斯卡拉:

object SomeScalaObject { 
    def it = this 
} 

的Java:

doStuff(SomeScalaObject.it()); 
2

我发现这个这个通用功能是最强大的。您需要提供类型参数,但演员只出现一次,这很好。由于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(); 
    } 
}