2012-01-30 16 views
22

आप जावा से scala.None तक कैसे पहुंच सकते हैं?स्केल तक पहुंचना। जावा से कोई नहीं

अंतिम पंक्ति कंपाइलर को "टाइप स्केल" के साथ मरने का कारण बनती है। कोई पैरामीटर नहीं लेता है "।

import scala.Option; 
import scala.Some; 
import scala.None; 
final Option<String> object1 = new Some<String>("Hi there"); 
final Option<String> object2 = new None<String>(); 

इस के साथ "प्रतीक निर्माता कोई नहीं() नहीं मिल सकता है" विफल रहता है:

final Option<String> object2 = new None(); 

इस के साथ विफल "प्रतीक चर कोई भी नहीं मिल सकता है":

final Option<String> object2 = None; 

2007 में यह करने के लिए इस्तेमाल काम, लेकिन फिर स्कैला बदल गया। जावा कम्पाइलर error: incompatible types देता है:

final Option<String> object2 = scala.None$.MODULE$; 
+0

वैसे ... 'scala.None $ .MODULE $' अभी भी काम करना चाहिए । आपके पास क्या समस्या है? –

+0

संभावित डुप्लिकेट [जावा कोड से स्कैला का उपयोग कैसे करें] (http://stackoverflow.com/questions/1997433/how-to-use-scala-none-from-java-code) –

उत्तर

30

यह काम हो सकता है:

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

डीईएफ़ लागू [एक] (एक्स: एक): विकल्प [एक]
एक विकल्प कारखाने जो कुछ बनाता है (x) अगर तर्क शून्य नहीं है, और कोई नहीं है तो यह शून्य है।

+0

बदसूरत, लेकिन प्रभावी –

+5

जावा की तरह: बदसूरत लेकिन प्रभावी –

+0

आपका स्कैला संस्करण क्या है? स्कैला 2.11 में, यह काम नहीं करता है। –

0

आप निम्न कर सकते हैं (मैं इसे बाहर का परीक्षण किया और यह स्काला 2.9.1 और जावा 1.6 के साथ मेरे लिए ठीक काम करता है):

final Option<String> obj1 = Some.apply(null) // This will give you a None; 
System.out.println(obj1.getClass()); // will print "class scala.None$ 

final Option<String> obj2 = Some.apply("Something"); 
System.out.println(obj2.getClass()); //will print "class scala.Some 
+0

जब मैंने इसे लिखा था तो मुझे उत्तर @ om-nom-nom उत्तर नहीं मिला था, लेकिन मुझे लगता है कि यह भी काम करना चाहिए। – vladmore

+1

'कुछ (शून्य) 'कुछ (शून्य)' है, नहीं' कोई नहीं '। –

+0

यही वही है जो मुझे उम्मीद थी, क्योंकि यह समझ में आएगा और यही तब होता है जब मैं स्केल दुभाषिया के माध्यम से कोशिश करता हूं। लेकिन जब मैं कोड को एक जावा फ़ाइल में ऊपर पोस्ट करता हूं और चलाता हूं कि मुझे obj2.getClass() मुझे कोई नहीं $ मिलता है। मुझे यकीन नहीं है कि क्यों। – vladmore

9

नहीं भी ठीक उस पर एक बिंदु डाल करने के लिए है, लेकिन किसी को स्थिर फॉरवर्डर्स पर भरोसा नहीं करना चाहिए, क्योंकि वे कुछ परिस्थितियों में उत्पन्न नहीं हो सकते हैं। उदाहरण के लिए, Some में अपने ऑब्जेक्ट साथी के लिए स्थिर फ़ॉरवर्डर्स नहीं हैं।

एक वस्तु साथी पर तरीकों तक पहुँचने की वर्तमान तरीका यह है:

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

Option$Option की वस्तु साथी के लिए वर्ग है। MODULE$ एक अंतिम सार्वजनिक स्थैतिक क्षेत्र है जिसमें Option$ का एकमात्र उदाहरण शामिल है (दूसरे शब्दों में, ऑब्जेक्ट साथी)।

+0

मैं बेहतर अंक की सराहना करता हूं! –

14

स्काला 2.10.2 का उपयोग करना (कौन-सा संस्करण पर यकीन नहीं जब इस में आया था):

final Option<String> none = Option.empty(); 
0

स्काला संस्करण 2.11.4 केवल बात यह है कि मेरे मामले में बाहर काम का उपयोग करना,

Option<String> maybeAmount = (amount != MISSING_STOCKAMOUNT) 
? Some.apply(amount+"") : Option.<String>apply(null); // can you feel the pain?? 
था

अद्यतन: एकदम सही ढंग से बाद में एक दिन ...

Option.apply(null); 

प्रकार पैरामीटर के बिना भी काम करता है। किसी कारण से मैं अपने पहले प्रयास पर कोड संकलित करने के लिए इंटेलिज नहीं प्राप्त कर सका। मुझे द्वितीयक प्रकार पैरामीटर पास करना पड़ा।अब यह संकलित, बस

+0

हाँ, यह दर्दनाक लगता है। जावा का आप किस संस्करण का उपयोग कर रहे हैं? –

+0

ओरेकल जेडीके 1.8.0_65 – simou

1

मत पूछो तुम

import scala.compat.java8.OptionConverters; 

और फिर आयात कर सकते हैं:

OptionConverters.<YourType>toScala(Optional.empty())