जावा में स्ट्रिंगर को इंटेगर कास्ट क्यों नहीं किया जा सकता?


95

मुझे कुछ अजीब अपवाद मिले:

java.lang.ClassCastException: java.lang.Integer 
 cannot be cast to java.lang.String

यह कैसे संभव हो सकता है? प्रत्येक वस्तु स्ट्रिंग को डाली जा सकती है, है ना?

कोड है:

String myString = (String) myIntegerObject;

धन्यवाद।


11
"प्रत्येक वस्तु को स्ट्रिंग में डाला जा सकता है" - यह गलत है। बल्कि, प्रत्येक वस्तु की एक toString()विधि होती है जो इसे एक स्ट्रिंग में बदल देगी। जैसा कि कई उत्तर बताते हैं, कि आपको क्या उपयोग करना चाहिए। (कुछ वस्तुओं के लिए, toString()बहुत उपयोगी स्ट्रिंग वापस नहीं करता है , लेकिन इसके लिए Integer, यह संभवतः वही करता है जो आप चाहते हैं।)
टेड हॉप

2
""+myIntegerObjectयह भी काम करता है :)
सलमान वॉन अब्बास

1
मेरे मामले में, यह त्रुटि गलती से बताई गई थी ... मैं उपयोग कर रहा था Integer.toString(IntegerObject)और इसने मुझे यह त्रुटि दी, लेकिन यह खुश है IntegerObject.toString()... और हाँ, यह वास्तव में एक पूर्णांक है, और मुझे वास्तव में यह त्रुटि मिली ...
एंड्रयू

स्क्रैच कि, केवल String.valueOf()वास्तव में काम करता है ...
एंड्रयू

जवाबों:


155

यह क्यों संभव नहीं है:

क्योंकि स्ट्रिंग और इंटेगर एक ही वस्तु पदानुक्रम में नहीं हैं।

      Object
     /      \
    /        \
String     Integer

आप जो कास्टिंग कर रहे हैं, वह केवल तभी काम करता है जब वे एक ही पदानुक्रम में हों, जैसे

      Object
     /
    /
   A
  /
 /
B

इस मामले में, (A) objBया (Object) objBया (Object) objAकाम करेंगे।

इसलिए जैसा कि दूसरों ने पहले ही उल्लेख किया है, पूर्णांक को स्ट्रिंग उपयोग में बदलने के लिए:

String.valueOf(integer), या Integer.toString(integer)आदिम के लिए,

या

Integer.toString() वस्तु के लिए।


क्या (ए) ओब्जा, (बी) ओब्जेब और (बी) ओब्जा के बारे में?
su-ex

@ सु-एक्स (B) objAकाम नहीं करेगा। (A) objAऔर (B) objBकाम करेंगे।
भूषण

क्षमा करें, आप सही कह रहे हैं, यह क्लासकैस्ट एक्ससेप्शन देता है। अन्य दो काफी बेकार हैं लेकिन निश्चित रूप से काम करेंगे।
su-ex

45

नहीं, Integerऔर Stringविभिन्न प्रकार हैं। एक पूर्णांक को स्ट्रिंग उपयोग में बदलने के लिए: String.valueOf(integer)या Integer.toString(integer)आदिम, या Integer.toString()वस्तु के लिए।


1
@ टेड हॉप - कौन सा? यदि यह पहले दो का एक आदिम उपयोग है, अगर यह तीसरा वस्तु का उपयोग करता है।
पेटर मिनचेव

उफ़। मैंने आपके उत्तर के उस अंतिम वाक्यांश को नहीं देखा। मैं अपनी टिप्पणी हटा रहा हूं और इस जवाब को बढ़ा रहा हूं।
टेड हॉप

1
समान (लेकिन डुप्लिकेट नहीं) समस्या: एक 'int' को एक स्ट्रिंग में नहीं डाला जा सकता है क्योंकि एक 'int' एक वस्तु नहीं है, स्ट्रिंग पदानुक्रम में बहुत कम है।
केली एस। फ्रेंच

20

के लिए intप्रकार का उपयोग करें:

int myInteger = 1;
String myString = Integer.toString(myInteger);

के लिए Integerप्रकार का उपयोग करें:

Integer myIntegerObject = new Integer(1);
String myString = myIntegerObject.toString();

यह एक अनावश्यक अनबॉक्सिंग ऑपरेशन को मजबूर करता है।
टेड होप

@ टेड होप ने मेरे संपादन को स्पष्ट करने के लिए कि प्रत्येक प्रकार की toString()विधि का उपयोग कब किया
DRiFTy

मुझे लगता है कि अंतिम पंक्ति होनी चाहिएString myString = myIntegerObject.toString();
टेड होप

6

नहीं। प्रत्येक वस्तु को java.lang.Objectए, किसी को नहीं डाला जा सकता है String। यदि आप किसी भी वस्तु का एक स्ट्रिंग प्रतिनिधित्व चाहते हैं, तो आपको toString()विधि को लागू करना होगा ; यह स्ट्रिंग को ऑब्जेक्ट को कास्टिंग करने जैसा नहीं है।


5

ऑब्जेक्ट्स को विधि का उपयोग करके स्ट्रिंग में परिवर्तित किया जा सकता है toString():

String myString = myIntegerObject.toString();

कास्टिंग को लेकर ऐसा कोई नियम नहीं है । काम करने के लिए कास्टिंग करने के लिए, वस्तु को वास्तव में उस प्रकार का होना चाहिए जिसे आप कास्टिंग कर रहे हैं।


5

आप स्पष्ट रूप से कुछ भी नहीं डाल सकते हैं Stringजो नहीं है String। आपको या तो उपयोग करना चाहिए:

"" + myInt;

या:

Integer.toString(myInt);

या:

String.valueOf(myInt);

मैं दूसरा रूप पसंद करता हूं, लेकिन मुझे लगता है कि यह व्यक्तिगत पसंद है।

ठीक संपादित करें , यहां मैं दूसरा रूप क्यों पसंद करता हूं। पहला रूप, जब संकलित किया गया था, तो तत्काल StringBuffer(जावा 1.4 में) या StringBuilder1.5 में; कचरा एकत्र करने वाली एक और चीज। कंपाइलर इसे ऑप्टिमाइज़ नहीं करता है जहाँ तक मैं बता सकता हूँ। दूसरे रूप में एक एनालॉग भी है, Integer.toString(myInt, radix)जो आपको यह निर्दिष्ट करने देता है कि क्या आप हेक्स, ऑक्टल, आदि चाहते हैं। यदि आप अपने कोड के अनुरूप होना चाहते हैं (विशुद्ध रूप से सौंदर्यवादी रूप से, मुझे लगता है) दूसरे रूप का उपयोग अधिक स्थानों में किया जा सकता है।

संपादित करें 2 मैंने माना है कि आपका पूर्णांक एक intनहीं था Integer। यदि यह पहले से ही एक है Integer, तो बस toString()उस पर उपयोग करें और किया जाए।


ओपी एक इंटेगर ऑब्जेक्ट के साथ शुरू हो रहा है। यह सिर्फ करने के लिए बहुत अधिक कुशल है myIntegerObject.toString()
टेड हॉप

4

यदि आप स्ट्रिंग प्रतिनिधित्व चाहते हैं तो आपको myIntegerObject.toString () कॉल करना चाहिए।


2

अनौपचारिक शब्दावली का उपयोग करने के लिए कास्टिंग जावा में परिवर्तित होने से अलग है।

ऑब्जेक्ट को कास्टिंग करने का मतलब है कि ऑब्जेक्ट पहले से ही वह है जिसे आप इसे कास्टिंग कर रहे हैं, और आप बस इसके बारे में कंपाइलर को बता रहे हैं। उदाहरण के लिए, यदि मेरे पास एक Fooसंदर्भ है जो मुझे पता है कि एक FooSubclassउदाहरण है, तो (FooSubclass)Fooसंकलक को बताता है, "उदाहरण को न बदलें, बस यह जान लें कि वास्तव में ए है FooSubclass

दूसरी ओर, एक Integerऐसा नहीं है String, हालांकि (जैसा कि आप बताते हैं) वहाँ एक है Stringकि एक का प्रतिनिधित्व करने के लिए तरीके हैं Integer। चूंकि का कोई कोई उदाहरण Integerकर सकते हैं कभी भी एक हो String, तुम डाली नहीं कर सकते Integerकरने के लिए String


1

आपके मामले में आपको कास्टिंग की आवश्यकता नहीं है, आपको कॉल करने की आवश्यकता है ()।

Integer i = 33;
String s = i.toString();
//or
s = String.valueOf(i);
//or
s = "" + i;

कास्टिंग। यह कैसे काम करता है?

दिया हुआ:

class A {}
class B extends A {}

(ए)
  |
(बी)

B b = new B(); //no cast
A a = b;  //upcast with no explicit cast
a = (A)b; //upcast with an explicit cast
b = (B)a; //downcast

एक ही वंशानुक्रम के पेड़ में A और B हम कर सकते हैं:

a = new A();
b = (B)a;  // again downcast. Compiles but fails later, at runtime: java.lang.ClassCastException

संकलक को उन चीजों की अनुमति देनी चाहिए जो संभवतः रनटाइम पर काम कर सकते हैं। हालाँकि, यदि कंपाइलर 100% जानता है कि कलाकार संभवतः काम नहीं कर सकता है, तो संकलन विफल हो जाएगा।
दिया हुआ:

class A {}
class B1 extends A {}
class B2 extends A {}

        (ए)
      / \
(बी 1) (बी 2)

B1 b1 = new B1();
B2 b2 = (B2)b1; // B1 can't ever be a B2

त्रुटि: असंगत प्रकार B1 और B2। संकलक 100% के साथ जानता है कि कलाकार संभवतः काम नहीं कर सकता है। लेकिन आप संकलक को धोखा दे सकते हैं:

B2 b2 = (B2)(A)b1;

लेकिन वैसे भी रनटाइम पर:

थ्रेड में मुख्य "java.lang.ClassCastException: B1 को B2 में नहीं डाला जा सकता है

आपके मामले में:

          (ऑब्जेक्ट)
            / \
(पूर्णांक) (स्ट्रिंग)

Integer i = 33;
//String s = (String)i; - compiler error
String s = (String)(Object)i;

रनटाइम पर: थ्रेड में अपवाद "java.lang.ClassCastException: java.lang.Integer को java.lang.String में नहीं डाला जा सकता है


0

String.valueOf (पूर्णांक) का उपयोग करें ।

यह पूर्णांक का एक स्ट्रिंग प्रतिनिधित्व देता है।


जैसा कि पेटार ऊपर कहते हैं, वह होना चाहिएString.valueOf(integer)
उर्स रिपेक

@UrsReupke: धन्यवाद, वास्तव में जब मैं लिंक जोड़ने की कोशिश कर रहा था मैंने इसे फिर से गलत लिखा।
रणराग

0

नीचे की तरह .toString का उपयोग करें:

String myString = myIntegerObject.toString();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.