2012-07-26 14 views
9

JavaConversions और JavaConverters में कोड को देखते हुए, मैं अनिश्चित (2.10) के साथ "सही" जिस तरह से जावा और स्काला संग्रह के बीच जो कन्वर्ट करने के लिए (किसी भी दिशा में) कर रहा हूँ है।जावा <-> स्काला संग्रह रूपांतरण, स्काला 2.10

बहुत से @ डीप्रेटेड एनोटेशन प्रतीत होते हैं।

क्या स्कैला टीम (टाइपएफ़?) से एक निश्चित उत्तर प्रकाशित किया गया है?

धन्यवाद, जॉन

+0

देखें http://stackoverflow.com/questions/8301947/what-is-the-difference-between-javaconverters-and-javaconversions-in-scala – jond3k

उत्तर

13

मैं किसी भी तरह के घोषणा के बारे में पता नहीं है, लेकिन तुम सिर्फ हमेशा JavaConverters का उपयोग करना चाहिए, अर्थात जो कि आप .asScala और .asJava साथ रूपांतरण इंगित करने के लिए आवश्यकता होती है।

जैसा कि मैं इसे समझता हूं, JavaConverters 2.8.1 में लाया गया था क्योंकि JavaConversions 2.8 में खतरनाक थे और उन चीजों को गलती से परिवर्तित करना आसान बना दिया जहां आप इसकी अपेक्षा नहीं कर रहे थे।

6

एक अलग तरीके से दो काम करता है:

  • JavaConverters अपने वस्तुओं किसी कक्षा के pimped हो जाएगा जो asScala और asJava समर्थन करते हैं, जो आप प्रोग्राम अपने संग्रह बदलने देते साथ

  • JavaConversions के साथ, एक जावा/स्काला संग्रह जब

उत्तरार्द्ध के साथ जोखिम एक प्रदर्शन गलती का भुगतान गलत या अनावश्यक रूपांतरण प्राप्त करने के लिए है की आवश्यकता स्वतः परिवर्तित किया जाएगा। इसके अतिरिक्त, कम से कम स्कैला 2.9 में अंतर्निहित रूपांतरण की कोई कैशिंग नहीं है, यानी यदि एक ही विधि को विधि के अंदर दो बार लागू किया जाता है, तो रूपांतरण कोड को दो बार बुलाया जाता है।

जब आप स्पष्ट रूप से संग्रह को रूपांतरित करते हैं, यदि आपको इसे "जावा" संस्करण में चाहिए, तो आप एक ही विधि में दो बार कॉल करने से बचेंगे।

16

यह import JavaConversions._ के खतरों के लिए पोस्टर बच्चा उदाहरण है:

scala> val m = Map(1 -> "one") 
m: scala.collection.immutable.Map[Int,String] = Map(1 -> one) 

scala> m.contains(1) 
res0: Boolean = true 

scala> m.contains("") 
<console>:9: error: type mismatch; 
found : String("") 
required: Int 
       m.contains("") 
         ^

scala> import collection.JavaConversions._ 
import collection.JavaConversions._ 

scala> m.contains("") 
res2: Boolean = false 

इसके बजाय का एक प्रकार त्रुटि जारी करने, संकलक एक java.util.Map है, जो एक हारने हस्ताक्षर Object स्वीकार करता है करने के लिए करने के लिए स्काला Map बदल देता है।