2010-01-04 5 views
33

संभव डुप्लिकेट:
Accessing scala.None from Javaजावा कोड से scala.None का उपयोग कैसे करें

जावा में आप निर्माता, यानी new Some(value) का उपयोग कर Some का एक उदाहरण बना सकते हैं, लेकिन None नहीं है साझेदार वर्ग जावा से स्कैला फ़ंक्शन में आप None कैसे पास करते हैं?

उत्तर

19

मुझे लगता है कि यह बदसूरत सा काम करेगा: scala.None$.MODULE$

एक नया उदाहरण के लिए कोई जरूरत नहीं है के बाद से एक कोई भी एक और के रूप में के रूप में अच्छा है ...

10

आप का उपयोग जावा से सिंगलटन कोई भी उदाहरण उपयोग कर सकते हैं :

scala.None$.MODULE$ 
49

scala.None$.MODULE$ बात हमेशा की तरह, typecheck नहीं करता है उदाहरण के लिए इस संकलन नहीं करता है:

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

क्योंकि javac स्काला की घोषणा साइट विचरण के बारे में पता नहीं है, इसलिए आपको मिलेगा:

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 ((स्ट्रिंग) शून्य) लिखना पड़ा। – Eric

+1

धन्यवाद! यह मेरे लिए काम किया, जबकि scala.None $ .MODULE $ उत्पादन प्रकार त्रुटियों। –

1

इस stinkfest का सामना करते हुए मेरी हमेशा की तरह काम करने का ढंग है:

स्काला:

object SomeScalaObject { 
    def it = this 
} 

जावा:

doStuff(SomeScalaObject.it()); 
2

मैं इस इस सामान्य समारोह मिल गया है सबसे मजबूत होने के लिए । आपको प्रकार पैरामीटर की आपूर्ति करने की आवश्यकता है, लेकिन कलाकार केवल एक बार प्रकट होता है, जो अच्छा है। कुछ अन्य समाधान विभिन्न परिदृश्यों में काम नहीं करेंगे, क्योंकि आपका जावा कंपाइलर आपको सूचित कर सकता है।

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