2015-03-11 10 views
10

मैं एक विधि की तरह एक सरणी पैरामीटर होने है नए ऑपरेटर या डबल ब्रेसेस प्रारंभकर्ता जैसे {1, 2, 3} द्वारा। उदाहरण के लिए, int[] foo = new int[3];याint[] foo = {1, 2, 3};डबल ब्रेस प्रारंभकर्ता और सरणी

लेकिन विधि के लिए पैरामीटर के रूप में डबल ब्रेस प्रारंभकर्ता का उपयोग करना असंभव है। {} केवल एक सरणी वस्तु बनाने के लिए उपलब्ध है।

और यहां मेरा प्रश्न है: क्या नए ऑपरेटर और {} के बीच कोई अंतर है? यदि वहां है, तो यह क्या है?

+0

आपकी टिप्पणी के लिए धन्यवाद, डरावनी। और यह बिल्कुल मेरा मुद्दा है। foo ({1, 2, 3}) काम नहीं कर रहा है ... –

+4

'foo (नया int [] {1, 2, 3}) ' – Eran

+0

@Eran हाँ काम करता है, लेकिन यहां सवाल यह है कि int [] i = {1,2,3}; काम लेकिन फू नहीं ({1,2,3}); – Subler

उत्तर

17

{} के रूप में एक int foo[] = {1, 2, 3}; का हिस्सा क्या ब्रेस प्रारंभ के रूप में कहा जाता है, और int foo[] = new int[]{1, 2, 3}; के लिए एक शॉर्टकट क्योंकि new int[] बाएं हाथ की ओर से अनुमान लगाया जा सकता है।

दूसरे मामले में foo({1, 2, 3}); आपके इरादे का कोई अनुमान नहीं है क्योंकि {1, 2, 3} का अर्थ यह नहीं है कि संकलक शिकायत करता है।

जब आप इसे foo(new int[]{1, 2, 3}); के रूप में फिर से लिखते हैं तो आप संकलक को बता रहे हैं कि {} में आइटम का प्रतिनिधित्व करने के लिए क्या मतलब है।

संकलक {} अभिव्यक्ति को तब तक अभिव्यक्त नहीं करेगा जब तक यह मेल नहीं खाता - इससे संभावित अस्पष्टताएं उत्पन्न हो जाएंगी।

this question भी है, जो वास्तव में एक ही जमीन को कवर करने लगता है।

जैसा कि @benzonico द्वारा उल्लिखित है, यह language specification का हिस्सा है क्योंकि यह एक समर्थित वाक्यविन्यास है, जिसमें इसे किसी विधि के आमंत्रण में शामिल नहीं किया जाता है।

5

बस दूसरे उत्तर को पूरा करने के लिए, आप JLS 8 10.6 पर एक नज़र डाल सकते हैं: आप देख सकते हैं कि व्याकरण में एक परिवर्तनीय प्रारंभकर्ता या तो एक अभिव्यक्ति या (विशेष) एक सरणी प्रारंभकर्ता है (जो अभिव्यक्ति नहीं है और इस प्रकार यह नहीं हो सकता है एक विधि का आह्वान करते समय उपयोग करें)।

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