2011-06-01 7 views
11

क्या scala.collection.mutable.StringBuilder को java.lang.StringBuilder में परिवर्तित करने के लिए एक निहित विधि है?स्कैला स्ट्रिंगबिल्डर

मैं जावा लाइब्रेरी (जेकॉमेंडर) का उपयोग कर रहा हूं जिसमें विधियों में से एक (usage) java.jang.StringBuilder तर्क लेता है।

उत्तर

9

आप को स्कैला StringBuilder के साथ प्रारंभ नहीं कर सकते हैं और फिर जावा संस्करण प्राप्त कर सकते हैं। हालांकि, आप स्कैला संस्करण में java.lang.StringBuilder लपेट सकते हैं। तो:

val jsb = new java.lang.StringBuilder(); 
val sb = new StringBuilder(jsb); 
// Do Scala-y stuff with sb 
JCommander.whatever.usage(jsb); 
// Do more Scala-y stuff 

के बाद से - कोई गारंटी नहीं होती, लेकिन सच व्यवहार में अभी (2.8, 2.9) - स्काला आवरण किसी भी राज्य (बजाय सिर्फ जावा संस्करण के संदर्भ में) की दुकान नहीं है, तो आप ' मिश्रण और दो के उपयोग से मेल खाने के लिए सुरक्षित हैं।

1

उपयोग को बदलने के इस अंतर्निहित ऐसा क्यों करें:

implicit def b2b(b: scala.collection.mutable.StringBuilder) = 
     new java.lang.StringBuilder(b) 
+1

असल में, मुझे नहीं लगता कि यह काम करेगा। मुझे लगता है कि किसी भी जावा विधि की अपेक्षा है कि 'java.lang.StringBuilder' इसे संशोधित करने की अपेक्षा करता है और कॉलर को उन परिवर्तनों तक पहुंच की अनुमति देता है। आपके द्वारा दिखाए गए 'निहित' विधि 'scala.collection.mutable.StringBuilder' की "रक्षात्मक" प्रतिलिपि बनाता है। कॉल किए गए विधि में कोई भी परिवर्तन ** नहीं ** ** scala.collection.mutable.StringBuilder' में दिखाई देगा। अब जब मैं इसके बारे में सोचता हूं, तो इसे लागू करने का एकमात्र तरीका यह है कि यदि 'scala.collection.mutable.StringBuilder' विस्तारित या लपेटा गया है' java.lang.StringBuilder'। – Ralph

4

स्रोत कोड को देखते हुए, यह वहाँ एक scala.collection.mutable.StringBuilder से एक java.lang.StringBuilder प्राप्त करने के लिए बिल्कुल कोई रास्ता लगता है।

आप स्कैला के साथ एक नया java.lang.StringBuilder बना सकते हैं, कुछ प्रकार के रूपांतरण (String या CharSequence) के माध्यम से जा रहे हैं।

संबंधित मुद्दे