2010-01-04 99 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(); 
    } 
}