2010-01-24 10 views
7

मैं एससीजेपी परीक्षा की तैयारी कर रहा हूं और चौड़े भाग का अध्ययन करते समय यह दिया गया है कि चौड़ाई ओवरलोडिंग में बॉक्सिंग और वर-बहस दोनों को धड़कता है लेकिन कोई स्पष्ट स्पष्टीकरण नहीं है। खोज की कोशिश की लेकिन कोई बेहतर जवाब नहीं मिला।एक विधि के ओवरलोडिंग में बॉक्सिंग और var-args दोनों को क्यों बढ़ाता है?

मुझे एक जवाब मिला क्योंकि संकलक नई शैली चुनने से पहले पुरानी शैली चुनता है। लेकिन मुझे विश्वास नहीं है।

संपादित करें: मुझे पता है कि चौड़ाई मुक्केबाजी और var-args से preferrd है। लेकिन मेरा सवाल क्यों है। जिसमें से मैं एक जानता हूँ। किसी भी अन्य कारणों से।

+2

संगतता की तुलना में कोई अन्य कारण होने की आवश्यकता नहीं है। जावा में कई अन्य "बेहतर" चीजों को स्क्वैश करने के प्राथमिक कारण के रूप में संगतता को उद्धृत किया गया है; उदाहरण के लिए, संशोधित जेनरिक के बजाय मिराज-आधारित जेनेरिक का उपयोग पूरी तरह से अनुकूलता के लिए रियायत है। –

+0

हमें बताए गए कारण बताएंगे कि हम इसे दोहराना नहीं चाहते हैं। – bmargulies

+0

वह जिसे मैंने पहले ही प्रश्न में उल्लेख किया है। शैली। – GuruKulki

उत्तर

15

हां, संगतता आवश्यकताओं के कारण कंपाइलर "नई शैली पर पुरानी शैली चुनता है"। जावा 5 के सामने लिखे गए कुछ कोड की कल्पना करें, जावा 5 के तहत संकलित होने पर अचानक व्यवहार में बदलाव आया था! वह बुरा होगा।

class Widen { 

    private static void widen(long k) { 
     System.out.println("Converted to long: " + k); 
    } 

    private static void widen(int ... k) { 
     System.out.println("Converted to varargs: " + k); 
    } 

    private static void widen(Integer k) { 
     System.out.println("Converted to Integer: " + k); 
    } 

    public static void main(String ... args) { 
     int value = 3; 
     widen(value); // Output: Converted to long: 3 
    } 
}  

तो यह सब का मतलब यह है कि यह है:

चौड़ा रूपांतरण जावा की सुबह के बाद से आसपास किया गया है, लेकिन autoboxing और varargs जावा के लिए नए हैं 5.

0

मैं तुम्हारे बारे में पता नहीं है, लेकिन मैं बहुत बल्कि चाहते हैं कि संकलक एक Byte के रूप में की तुलना में एक int के रूप में मेरे byte पारित कर दिया। ओवरहेड पर विचार करें। और varargs भी मुक्केबाजी की आवश्यकता है।

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

'आवश्यक', आप पूछते हैं? Varargs कार्यों को Object की सरणी प्राप्त करने की उम्मीद है, और इसमें एक आदिम प्रकार शामिल नहीं हो सकता है।

संगतता कोई बुरा कारण नहीं है, या तो।

+0

यही वह है जो मैं पूछ रहा हूं क्यों? कोई कारण। – GuruKulki

+1

यह एक कारण है। मुझे दोबारा प्रयास करने दें। – bmargulies

+0

@bmargulies - varargs को मुक्केबाजी की आवश्यकता क्यों होती है? –

5

यहाँ यह का एक उदाहरण है autoboxing और varargs का उपयोग करने से पहले चौड़ा होगा। यदि हमने लंबे पैरामीटर के साथ विस्तृत करने की विधि पूरी की है, तो यह varargs से पहले autoboxing चुना होगा।

1

कंपाइलर को जावा के पिछले संस्करणों के साथ संगतता रखना है। इसके शीर्ष पर संकलक तर्क में सबसे अधिक प्रदर्शन/सबसे छोटा परिवर्तन चुनता है। रैपर ऑब्जेक्ट बनाने वाली एक और आदिम बीट्स को बढ़ावा देना और जो स्मृति उपयोग और प्रदर्शन के संबंध में एक सरणी बनाते हैं।

0

बढ़ने का कारण बेहतर प्रदर्शन करता है क्योंकि यह विस्तार करने के लिए एक सरल ऑपरेशन है, अधिकांश CPUs के लिए एक ही निर्देश है। मुक्केबाजी के लिए एक ढेर आवंटन की आवश्यकता होती है, और बॉक्स की गई वस्तुओं तक पहुंचने के लिए अधिक महंगे होते हैं, कम से कम अतिरिक्त मेमोरी एक्सेस की आवश्यकता होती है।

संगतता समस्या के बावजूद, मुझे लगता है कि आप चाहते हैं कि भाषा सबसे तेज़ ओवरलोड लोड करे, जब तक कि यह व्यवहार कोई भी खराब समस्या नहीं पैदा करता।

0

धड़कन मुक्केबाजी को चौड़ा, मुक्केबाजी जेनरिक धड़कता है, जेनरिक हरा

-1
class Widen { 
    private static widen(long k) { 
     System.out.println("Converted to long: " + k); 
    } 
    private static widen(int ... k) { 
     System.out.println("Converted to varargs: " + k); 
    } 
    private static widen(Integer k) { 
     System.out.println("Converted to Integer: " + k); 
    } 
    public static void main(String ... args) { 
     int value = 3; 
     widen(value); // Output: Converted to long: 3 
    } 
} 

मन ऊपर हल करने के लिए इस varargs:

धड़कन मुक्केबाजी को चौड़ा, मुक्केबाजी धड़कता varargs

बाहर रखा जाएगा लंबे समय तक कनवर्ट किया गया: 3

+2

यह एक उत्तर नहीं है, [मैंगड्रंक के जवाब] की एक गंदे प्रतिलिपि (http://stackoverflow.com/a/2128068/1065197) एक अतिरिक्त बयान के साथ होना चाहिए एक टिप्पणी। कृपया ऐसे उत्तर प्रदान करने से बचें और प्रश्न/उत्तर पर टिप्पणियां पोस्ट करने के लिए कम से कम 50 प्रतिनिधि होने का इंतजार करें। –

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