2011-11-29 2 views
9

में स्कैला vararg विधियों का उपयोग करना जावा से उपयोग किए जाने वाले सभी स्कैला vararg विधियों, चर के एक वर्ग स्वीकार करने के लिए प्रतीत होता है, और जावा देशी vararg विधियों के रूप में उपयोग नहीं किया जा सकता है। क्या यह एक बग है?जावा

उदाहरण के लिए, Buffer में विधि def append(elems: A*): Unit है। लेकिन जावा में इसका एक और हस्ताक्षर है: void append(Seq<A>)

उत्तर

7

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

यदि आपको जावा से स्कैला varargs का उपयोग करने की आवश्यकता है, तो आपको इसके बजाय कुछ स्केल सेक बनाना चाहिए। उदाहरण के लिए, आप एक सरणी स्वचालित रूप से बनाए जाने के लिए जावा रैपर लिख सकते हैं, और फिर Predef ऑब्जेक्ट से genericWrapArray विधि का उपयोग करें।

+0

अच्छा, हाँ, यह काम करता है, लेकिन इतना गलत है)) – F0RR

+1

ऐसा इसलिए है क्योंकि जावा का उपयोग पहली जगह गलत है;) –

+0

अधिक जानकारी के लिए, http://stackoverflow.com/questions/10060377/how-to-use देखें -scala-varargs-से-जावा-कोड –

-5

आप आसानी से :_* का उपयोग कर varargs में Seq डाल सकते हैं। उदाहरण के लिए:

val b = collection.mutable.ListBuffer.empty[Int] 
b.append(List(1, 2):_*) 

इसलिए यह संग्रह API में कोड डुप्लिकेशन से बचता है।

तुम भी बस appendAll उपयोग कर सकते हैं:

b.appendAll((List(1, 2)) 
+0

ठीक है, हाँ, मैं कर सकता हूं, लेकिन यह मेरे प्रश्न का उत्तर कैसे देता है?)) – F0RR

+0

मैंने अभी अपना जवाब संशोधित कर दिया है। – David

+0

समस्या यह नहीं है कि सेक को स्कैला में varargs में नहीं डाला जा सकता है। समस्या यह है कि मुझे varargs के साथ एक विधि का उपयोग करने के लिए जावा में एक सेक बनाना है। – F0RR

14

यदि आप स्कैला कोड को नियंत्रित करते हैं तो आप इसे जावा-संगत वैरिएग विधि उत्पन्न करने के लिए @ वार्गार्ग का उपयोग कर सकते हैं, उदा। @varargs def append(elems: A*): Unit = {}