2013-06-03 7 views
5

नीचे दिए गए कोड में, x.test()[1,2] देता है।ग्रोवी: समान पैरामीटर, विभिन्न परिणाम

तो y = [1,2]

फिर भी f([1,2]) प्रिंट 1, लेकिन f(y) प्रिंट 2

मैं f(y) कैसे लिखूं ताकि यह 1 प्रिंट हो?

विपरीत, f(z)1 प्रिंट करता है, भले ही z = y

def f = { Object... args -> println args.size(); }; 

class Test { Object[] test() { return [1,2]; } } 

def x = new Test(); 
def y = x.test(); 
def z = [1,2]; 

f([1,2]); // 1 
f(y); // 2 
f(z); // 1 

उत्तर

0

y[1,2] जबकि और z[Ljava.lang.Object का एक उदाहरण है सरणी size() == 2 और एक तर्क के रूप में ArrayList रों गणना ArrayList

के कहने की हैं, लेकिन वे दो तत्वों

ग्रूवी शामिल क्या आपके लिए कुछ प्रकार परिवर्तित हो रहा है;)

11

समस्या यह है कि y और z, जबकि वे समान दिखते हैं, वास्तव में विभिन्न प्रकार के होते हैं। y एक Object[] है जबकि z एक ArrayList<Integer> है। ग्रोवी अलग-अलग सरणी और सूचियों को संभालता है, जो स्वचालित रूप से पूर्व को एक varargs पैरामीटर सूची में जोड़ता है, लेकिन बाद वाला नहीं।

println y.getClass(); // class [Ljava.lang.Object 
println z.getClass(); // class java.util.ArrayList 

आपकी समस्या के समाधान के लिए के रूप में, या तो बदल अपने test() एक सरणी के बजाय एक List वापस जाने के लिए:

class Test { List test() { return [1,2]; } } 

या मैन्युअल रूप से एक सूची जब आप इसे f के पास में सरणी मजबूर:

f(y as List); // 1 
2

ग्रूवी में अभिव्यक्ति [1,2] दो सदस्यों, Integer.valueOf(1) साथ एक ArrayList को दर्शाता है और Integer.valueOf(2)। इस प्रकार जब आप f([1,2]) पर कॉल करते हैं तो ग्रोवी एक एकल-तत्व सरणी बनाता है जिसमें इस ऐरेलिस्ट को एकमात्र आइटम होता है, और उस सरणी को बंद करने के तर्क के रूप में पास करता है।

लेकिन x.test()Object[] तो [1,2] ArrayList return द्वारा एक दो तत्व Object[] में परिवर्तित हो जाएगा वापस जाने के लिए घोषित किया जाता है। इस प्रकार y पहले से ही Object[] है और f पर जाने के लिए एक varargs सरणी में बॉक्स किए जाने की आवश्यकता नहीं है।

आप y एक सूची में वापस चालू करने की आवश्यकता है, या तो test() की वापसी प्रकार बदलकर या

f(y as List) 

इसके विपरीत कह कर, आप उपयोग कर सकते हैं फैल ऑपरेटर

f(*z) // 2 

जो ArrayList के तत्व निकालेंगे और उन्हें कॉल के लिए व्यक्तिगत तर्क के रूप में पास करेंगे (जिसे तब सामान्य रूप से एक varargs सरणी में पैक किया जाएगा)।

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