2012-04-08 29 views
19

स्कैला कोड से जावा varargs को कॉल करने पर बहुत सारे लेख हैं, लेकिन एकमात्र चीज जो मुझे विपरीत तरीके से मिल सकती है, यह प्रश्न था: Using scala vararg methods in java, जिसमें कोई ठोस उदाहरण नहीं है।जावा कोड से स्कैला varargs का उपयोग कैसे करें

मैं कुछ जावा कोड से scala.Console का उपयोग करने की कोशिश कर रहा हूं, क्योंकि java.io.Console एक्लिप्स में काम नहीं करता है, जबकि स्कैला एक करता है। लेकिन मैं विधि क्योंकि यह दूसरा तर्क के लिए एक scala.collection.Seq[Any] उम्मीद कर किया जा रहा है

def readLine (text: String, args: Any*): String 

काम करने के लिए, और मैं जावा में एक Seq बनाने का तरीका नहीं दिख रहा है नहीं मिल सकता है। मैं इसके आसपास कैसे काम कर सकता हूं?

बातें मैं कोशिश की है:

1) का उपयोग करते हुए अशक्त

// Java 
String s = scala.Console.readLine("Enter text: ", null); 

- एक NullPointerException के साथ पुरस्कृत मिलता है।

2) scala.collection.Seq.empty() साथ null की जगह है, लेकिन javac रिपोर्ट त्रुटियों के सभी प्रकार के इस तरह के Seq के रूप में एक empty विधि नहीं होने चाहिए।

3) scala.collection.immutable पैकेज वस्तु में Nil वस्तु का उपयोग करना, लेकिन वाक्य रचना here, जो scala.collection.immutable.package$Nil$.MODULE$ होगा सुझाव दिया है, लेकिन वह हल नहीं किया जा सकता है।

बेशक मैं केवल readLine() विधि का उपयोग कर सकता हूं जो varargs नहीं लेता है, लेकिन यह बहुत आसान होगा।

उत्तर

24

आप उपयोग कर सकते हैं:

scala.collection.Seq$.MODULE$.empty(); 

जावा कोड से एक खाली अनुक्रम बनाने के लिए। अन्यथा, आप उपयोग कर सकते हैं:

new scala.collection.mutable.ArrayBuffer(); 

एक खाली सरणी बफर जिसमें आप तो तत्वों को जोड़ने और स्काला vararg तरीकों के लिए एक तर्क के रूप में उपयोग कर सकते हैं बनाने के लिए।

अन्यथा, यदि आप जावा कोड से उपयोग करने के लिए वर्गार्ग विधियों के साथ एक स्कैला लाइब्रेरी डिज़ाइन करते हैं, तो varargs एनोटेशन का उपयोग करें। यह विधि का जावा संस्करण उत्पन्न करेगा जो Seq के बजाय सरणी लेता है।

scala> class A { 
    | @annotation.varargs def foo(x: Int*) { println(x) } 
    | } 
defined class A 

scala> println(classOf[A].getMethods.toList) 
List(public void $line1.$read$$iw$$iw$A.foo(scala.collection.Seq), public void $line1.$read$$iw$$iw$A.foo(int[]), ...) 

ऊपर, प्रतिबिंब से पता चलता विधि foo के 2 संस्करण उत्पन्न देखते हैं कि - एक और एक अन्य जो एक int[] लेता है कि एक Seq[Int] लेता है।

+1

मैंने उत्तर संपादित किया है। – axel22

+0

ग्रेट, यह काम करता है। दोनों अभी भी ग्रहण में त्रुटियां दिखाते हैं, लेकिन वे वास्तव में संकलित करते हैं। यह समस्या का हिस्सा हो सकता है। –

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

  • कोई संबंधित समस्या नहीं^_^