2009-06-19 7 views
9

मैंने एक प्रारंभकर्ता सूची {...} को एक निर्माता को पास करने का प्रयास किया है और यह काम नहीं करता है। जब मैंने इसे एक विधि में स्थानीय चर (int []) घोषित किया, तो यह बेकार ढंग से काम करता था।किसी विधि के लिए {ए, बी, सी} क्यों गुजर रहा है?

वह क्यों है?

public class QuickSort { 
    int[] a; 

    public QuickSort(int[] a) { 
     this.a = a; 
    } 

    public static void main(String[] args) { 
     // ################### 
     // ### WORKS  ## 
     // ################### 
     int[] a = {8,12,79,12,50,44,8,0,7,289,1}; 
     QuickSort sort = new QuickSort(a); 

     // ################### 
     // ### DOESN'T WORK ## 
     // ################### 
     //QuickSort sort = new QuickSort({8,12,79,12,50,44,8,0,7,289,1}); 
    } 
} 
+0

जैसा होता है, वैरगास भाषा विशेषताओं (जैसे java.util.Arrays.asList) मूल रूप से ऐसा करने जा रहा था। शायद इसे बदलने की गलती थी ... –

उत्तर

20

int[] घोषित करते समय और {1, 2, 3} असाइन करते समय संकलक जानता है कि आप int[] बनाना चाहते हैं क्योंकि यह वहां वर्तनी है।

उत्तरार्द्ध मामले जहां विधि में सीधे सरणी छड़ी में फोन आप

QuickSort sort = new QuickSort(new int[] {8,12,79,12,50,44,8,0,7,289,1}); 

उपयोग करने के लिए संकलक अपने सरणी है क्या बताने के लिए होगा।

+0

मैं देखता हूं। धन्यवाद। –

-1

क्या आपने इसे संरक्षक को पास करने से पहले int [] में सूची कास्टिंग करने का प्रयास किया है?

+0

हां, (int []) {1,2,3} काम नहीं किया। –

4

शायद यह है क्योंकि आपकी प्रारंभिक सूची में कोई टाइपिंग जानकारी नहीं है। इसे आज़माएं:

QuickSort sort = new QuickSort(new int[] {8,12,79,12,50,44,8,0,7,289,1}); 
2

जावा में वास्तव में टाइप अनुमान नहीं है। जावा भाषा विनिर्देश में ऐरे परिवर्तनीय घोषणाएं special case हैं, जो कि विधि पैरामीटर पर लागू नहीं होती है। ऐसा करना संभव होगा, लेकिन spec में बहुत जटिलता जोड़नी होगी, क्योंकि इसे {"a", "b"} स्ट्रिंग [] या ऑब्जेक्ट [] बनाता है जैसे प्रश्नों को संभालना होगा - यहां स्पष्ट दिखता है, लेकिन क्या होगा यदि यह एक जटिल प्रकार पदानुक्रम में वस्तुओं है? और क्या होगा अगर विधि अधिभारित हो और दोनों संस्करण मौजूद हैं?

4

आप भी इस तरह कर सकते हैं:

public class QuickSort { 
    int[] a; 

    public QuickSort(int ... a) { 
     this.a = a; 
    } 

    public static void main(String[] args) { 

     QuickSort sort = new QuickSort(8,12,79,12,50,44,8,0,7,289,1); 
    } 
} 
+0

बहुत अच्छा! मैं इसका उपयोग करूँगा। –

10

{} निर्माण एक सरणी प्रारंभकर्ता कहा जाता है, और यह जावा में एक सरणी प्रारंभ करने में प्रयोग किया जाता है। (संदर्भ: Section 10.6: Array InitializersThe Java Language Specification, Third Edition से।)

{1, 2, 3} पास करने का कारण वैध नहीं है क्योंकि प्रारंभकर्ता के साथ कोई प्रकार की जानकारी नहीं है।

इसलिए, किसी को संकलक को लिखकर सरणी के प्रकार को जानना चाहिए, जहां Type वह प्रकार है जिसके लिए सरणी बनाई गई है।

निम्नलिखित सरणी प्रारंभकर्ता के सभी वैध उपयोग कर रहे हैं:

  • new String[] {"Hello, "World"}
  • new Character[] {'A', 'B'}
  • new Runnable[] {new Runnable() {public void run() {}}, new Runnable() {public void run() {}}

के रूप में देखा जा सकता है, इस अंकन कई डेटा प्रकार के लिए इस्तेमाल किया जा सकता , इसलिए यह ऐसा कुछ नहीं है जो पूर्णांक के लिए विशिष्ट है।

के लिए के रूप में: क्योंकि प्रकार की जानकारी चर प्रकार घोषणा, जो इस मामले में int[] है में संकलक करने के लिए प्रदान की जाती है

int[] a = {1, 2, 3}; 

कारण है कि इसके बाद के संस्करण मान्य है।

int[] a = new int[] {1, 2, 3}; 

अब, अगर हम new int[] {1, 2, 3} है, हम जगह में एक नया int[] सारिणी निर्मित करने में सक्षम हैं, तो यह है कि किसी भी अन्य int[] सरणी के रूप में नियंत्रित किया जा सकता होगा - यह सिर्फ है: क्या ऊपर जिसका अर्थ है निम्नलिखित है कि इसमें इसके साथ जुड़े एक चर नाम नहीं है।

इसलिए, सरणी new int[] {1, 2, 3} द्वारा बनाई गई एक विधि या निर्माता है कि एक int[] अपने तर्क के रूप में लेता है में भेजा जा सकता है:

new Quicksort(new int[] {1, 2, 3}); // This will work. 
0

घुंघराले ब्रेसिज़ (जब सरणी शाब्दिक में प्रयुक्त) केवल जब घोषित किया जा सकता है सरणी :)

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

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