जावा ऑटोबॉक्सिंग ऑटोबॉक्स्ड प्रकारों के तरीकों के तरीकों के आविष्कार के लिए क्यों नहीं बढ़ती है?

मैं एक प्राचीन को एक स्ट्रिंग में परिवर्तित करना चाहता हूं, और मैंने कोशिश की:

myInt.toString();

यह त्रुटि के साथ विफल रहता है:

int cannot be dereferenced

अब, मुझे लगता है कि प्राइमेटिव संदर्भ प्रकार नहीं हैं (यानी, ऑब्जेक्ट नहीं) और इसलिए विधियां नहीं हो सकती हैं। हालांकि, जावा 5 ने ऑटोबॉक्सिंग और अनबॉक्सिंग (एक ला सी # ... पेश किया जो मुझे सी # में पसंद नहीं आया, लेकिन यह बिंदु के बगल में है)। तो ऑटोबॉक्सिंग के साथ, मैं उपरोक्त उम्मीद करता हूं कि उपरोक्त को इंटीजर में परिवर्तित करें और फिर उस पर toString() को कॉल करें।

इसके अलावा, मेरा मानना ​​है कि सी # ऐसी कॉल की अनुमति देता है, जब तक कि मुझे गलत तरीके से याद न हो। क्या यह जावा की ऑटोबॉक्सिंग / अनबॉक्सिंग विनिर्देश की एक दुर्भाग्यपूर्ण कमी है, या इसके लिए कोई अच्छा कारण है?

0
ro fr bn

8 उत्तर

जावा ऑटोबॉक्सिंग / अनबॉक्सिंग उस सीमा तक नहीं जाती है जिससे आप एक आदिम को कम कर सकते हैं, इसलिए आपका कंपाइलर इसे रोकता है। आपका कंपाइलर अभी भी myInt को आदिम के रूप में जानता है। jcp.org पर इस समस्या के बारे में एक पेपर है।

ऑटोबॉक्सिंग मुख्य रूप से असाइनमेंट या पैरामीटर गुजरने के दौरान उपयोगी होती है - जिससे आप ऑब्जेक्ट (या इसके विपरीत) के रूप में आदिम को पारित कर सकते हैं, या ऑब्जेक्ट (या इसके विपरीत) को आदिम असाइन कर सकते हैं।

तो दुर्भाग्यवश, आपको इसे ऐसा करना होगा: (कुडोस पैट्रिक, मैंने आपके रास्ते पर स्विच किया)

Integer.toString(myInt);
0
जोड़ा

जस्टिन ने जो कहा, उस पर डितो, लेकिन आपको इसके बजाय ऐसा करना चाहिए:

Integer.toString(myInt);

यह आवंटन या दो बचाता है और अधिक पठनीय है।

0
जोड़ा

यह उपयोगी होगा अगर जावा ने आदिम प्रकारों पर काम करने के लिए कुछ स्थैतिक तरीकों को परिभाषित किया और कुछ सिंटैक्टिक चीनी संकलक में बनाया गया ताकि वह

5.asInteger

के बराबर होगा

some.magic.stuff.Integer.asInteger(5);

मुझे नहीं लगता कि इस तरह की सुविधा मौजूदा नियमों के तहत संकलित किसी भी कोड के साथ असंगतता का कारण बनती है, और इससे कई मामलों में सिंटैक्टिक अव्यवस्था को कम करने में मदद मिलेगी। यदि जावा ऑटोबॉक्स प्राइमेटिव्स को थे जिन्हें संदर्भित किया गया था, तो लोग मान सकते हैं कि यह स्थैतिक विधि कॉल (जो प्रभावी रूप से .NET में होता है) के लिए डिफ्रेंसिंग सिंटैक्स मैप कर रहा था, और इस प्रकार उस रूप में लिखा गया ऑपरेशन अधिक महंगा नहीं होगा समकक्ष स्थैतिक विधि invocations। एक नई भाषा सुविधा जोड़ना जो लोगों को खराब कोड लिखने के लिए प्रोत्साहित करेगा (उदा। ऑटो-मुक्केबाजी डीरेन्स्क्रिप्टेड प्राइमेटिव्स) एक अच्छा विचार नहीं लग रहा है, हालांकि डीरफ्रेंसिंग-शैली विधियों की अनुमति हो सकती है।

0
जोड़ा

आपके उदाहरण के सबसे नज़दीकी वैध वाक्यविन्यास है

((Integer) myInt).toString();

जब कंपाइलर खत्म होता है, तो यह बराबर है

Integer.valueOf(myInt).toString();

हालांकि, यह पारंपरिक उपयोग, String.valueOf (myInt) निष्पादित नहीं करता है, क्योंकि, विशेष मामलों को छोड़कर, यह एक नया इंटीजर उदाहरण बनाता है, फिर तुरंत इसे फेंकता है, जिसके परिणामस्वरूप अधिक अनावश्यक कचरा। (पूर्णांक की एक छोटी सी श्रृंखला कैश की जाती है, और एक सरणी पहुंच द्वारा उपयोग किया जाता है।) शायद भाषा डिजाइनर प्रदर्शन कारणों से इस उपयोग को हतोत्साहित करना चाहते थे।

संपादित करें: अगर डाउनवॉटर इस बारे में टिप्पणी करेगा कि यह सहायक क्यों नहीं है, तो मैं इसकी सराहना करता हूं।

0
जोड़ा
मेरी इच्छा है कि सभी नीचे मतदाता टिप्पणी करेंगे कि कुछ क्यों मतदान किया जाता है। मैं हमेशा तब तक करता हूं जब तक कि यह स्पष्ट न हो (जैसे कि जवाब पूरी तरह गलत या बकवास है)।
जोड़ा लेखक Jason Coco, स्रोत
शायद लोगों द्वारा मतदान किया गया है कि कोड बिट्स को पढ़ा और सोचा कि आप इस तरह के कोड की वकालत कर रहे थे।
जोड़ा लेखक Kris, स्रोत

की कमी की तरह लगता है   मुझे विनिर्देश

और कमियां हैं और यह एक सूक्ष्म विषय है। यह देखें:

public class methodOverloading{
   public static void hello(Integer x){
      System.out.println("Integer");
   }

   public static void hello(long x){
      System.out.println("long");
   }

   public static void main(String[] args){
      int i = 5;
      hello(i);
   }
}

यहां "लंबा" मुद्रित किया जाएगा (इसे स्वयं जांच नहीं लिया है), क्योंकि संकलक ऑटोबॉक्सिंग पर चौड़ा हो जाता है। ऑटोबॉक्सिंग का उपयोग करते समय सावधान रहें या इसका उपयोग न करें!

0
जोड़ा

जैसा कि सभी ने इंगित किया है, ऑटोबॉक्सिंग आपको कुछ कोड को सरल बनाने देता है, लेकिन आप नाटक नहीं कर सकते कि प्राइमेटिव जटिल प्रकार हैं।

यह भी दिलचस्प है: "ऑटोबॉक्सिंग एक कंपाइलर-स्तर हैक है" जावा में Autoboxing मूल रूप से जावा पर एक अजीब kludge जोड़ा गया है। यह पोस्ट देखें कि यह कितना अजीब है ।

0
जोड़ा

सी # में, पूर्णांक न तो संदर्भ प्रकार हैं और न ही उन्हें ToString() कहने के लिए बॉक्स किया जाना चाहिए। वे हैं फ्रेमवर्क में ऑब्जेक्ट्स मानते हैं (एक वैल्यू टाइप के रूप में, इसलिए उनके पास मूल्य अर्थशास्त्र है), हालांकि। सीएलआर में, प्राइमेटिव पर विधियों को "अप्रत्यक्ष रूप से" उन्हें स्टैक (ldind) पर लोड करके बुलाया जाता है।

0
जोड़ा

ऐसा करने का एक और तरीका उपयोग करना है:

String.valueOf(myInt);

यह विधि प्रत्येक आदिम प्रकार और ऑब्जेक्ट के लिए अधिभारित है। इस तरह आपको उस प्रकार के बारे में भी सोचना नहीं पड़ता है जिसका आप उपयोग कर रहे हैं। विधि के कार्यान्वयन आपके लिए दिए गए प्रकार की उपयुक्त विधि को कॉल करेंगे, उदा। Integer.toString (मींट)

http://java.sun.com/javase/ देखें 6 / docs / api / जावा / लैंग / String.html

0
जोड़ा