জাভাতে স্ট্রিংয়ের জন্য পূর্ণসংখ্যা কাস্ট করতে পারে না কেন?


96

আমি কিছু অদ্ভুত ব্যতিক্রম পেয়েছি:

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

এটা কীভাবে সম্ভব? প্রতিটি বস্তুকে স্ট্রিংয়ে কাস্ট করা যায়, তাই না?

কোডটি হ'ল:

String myString = (String) myIntegerObject;

ধন্যবাদ


11
"প্রতিটি বস্তুকে স্ট্রিংয়ে কাস্ট করা যায়" - এটি ভুল। বরং, প্রতিটি বস্তুর একটি toString()পদ্ধতি রয়েছে যা এটিকে স্ট্রিংয়ে রূপান্তর করবে। বেশ কয়েকটি উত্তর যেমন নির্দেশ করে, আপনার ব্যবহার করা উচিত। (কিছু কিছু অবজেক্টের জন্য toString()খুব কার্যকর স্ট্রিং ফিরিয়ে দেয় না তবে Integerএটি সম্ভবত আপনি যা চান ঠিক
তেমনটি করে

4
""+myIntegerObjectএছাড়াও কাজ করে :)
সালমান ভন আব্বাস

4
আমার ক্ষেত্রে, এই ত্রুটিটি ত্রুটিযুক্ত হিসাবে রিপোর্ট করা হয়েছিল ... আমি ব্যবহার করছিলাম Integer.toString(IntegerObject)এবং এটি আমাকে এই ত্রুটিটি দিয়েছে তবে এতে খুশি IntegerObject.toString()... এবং হ্যাঁ, এটি সত্যই একটি পূর্ণসংখ্যা এবং আমি এই ত্রুটিটি সত্যই পেয়েছি ...
অ্যান্ড্রু

স্ক্র্যাচ যা কেবলমাত্র কার্যকর হয় String.valueOf()...
অ্যান্ড্রু

উত্তর:


157

কেন এটি সম্ভব নয়:

কারণ স্ট্রিং এবং পূর্ণসংখ্যা একই অবজেক্ট হায়ারার্কিতে নেই।

      Object
     /      \
    /        \
String     Integer

আপনি যে কাস্টিংটি চেষ্টা করছেন সেটি কেবল একই ধরণের শ্রেণিবিন্যাসে থাকলে কাজ করে

      Object
     /
    /
   A
  /
 /
B

এই ক্ষেত্রে, (A) objBবা (Object) objBবা (Object) objAকাজ করবে।

অন্যরা যেমন ইতিমধ্যে উল্লেখ করেছে, একটি পূর্ণসংখ্যাটি স্ট্রিং ব্যবহারে রূপান্তর করতে:

String.valueOf(integer), বা Integer.toString(integer)আদিম জন্য,

বা

Integer.toString() বস্তুর জন্য


(এ) ওজেএ, (খ) আপত্তিবি এবং (খ) আপত্তি সম্পর্কে কী?
সু-প্রাক্তন

@ সু-প্রাক্তন (B) objAকাজ করবে না। (A) objAএবং (B) objBকাজ করবে।
ভূষণ

দুঃখিত, আপনি ঠিক বলেছেন, এটি একটি ClassCastException দেয়। অন্য দুটি বেশ নিরর্থক তবে অবশ্যই কাজ করবে।
su-প্রাক্তন

45

না, Integerএবং Stringবিভিন্ন ধরণের। পূর্ণসংখ্যাকে স্ট্রিংয়ে রূপান্তর করতে: String.valueOf(integer)বা Integer.toString(integer)আদিম বা Integer.toString()বস্তুর জন্য।


4
@ টেড হপ্প - কোনটি? এটি যদি প্রথমটি ব্যবহার করে তবে প্রথম দুটি ব্যবহার করুন, এটি যদি পূর্ণসংখ্যার বস্তু হয় তবে তৃতীয়টি ব্যবহার করুন।
পেটার মিনচেভ

উফ! আমি আপনার উত্তরের শেষ বাক্যাংশটি দেখিনি। আমি আমার মন্তব্য মুছে ফেলছি এবং এই উত্তরটি upvoting করছি।
টেড হপ

4
অনুরূপ (তবে সদৃশ নয়) ইস্যু: স্ট্রিংয়ের জন্য একটি 'ইন্ট' কাস্ট করা যাবে না কারণ স্ট্রিং হায়ারার্কিতে কোনও 'ইনট' কোনও বস্তু নয়।
কেলি এস ফরাসি

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

নং প্রতিটি বস্তু একটি থেকে casted যাবে java.lang.Object, না একটি String। আপনি যদি যে কোনও বস্তুর স্ট্রিং প্রতিনিধিত্ব করতে চান তবে আপনাকে toString()পদ্ধতিটি গ্রহণ করতে হবে; এই হল না একটি স্ট্রিং বস্তুর ভোটদান হিসাবে একই।


5

পদ্ধতিটি ব্যবহার করে অবজেক্টগুলিকে স্ট্রিংয়ে রূপান্তর করা যায় toString():

String myString = myIntegerObject.toString();

কাস্টিং সম্পর্কে এ জাতীয় কোনও নিয়ম নেই । কাজ করার জন্য ingালাই করার জন্য, অবজেক্টটি আসলে আপনি যে ধরণের কাস্টিং করছেন তা হতে হবে।


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()
টেড হপ


2

Informaালাই জাভাতে রূপান্তর করা, অনানুষ্ঠানিক পরিভাষা ব্যবহারের চেয়ে আলাদা।

কোনও বস্তু নিক্ষেপ করার অর্থ হ'ল যে বস্তুটি আপনি এটিতে কাস্ট করছেন তা হ'ল এবং আপনি কেবল এটি সম্পর্কে সংকলককে বলছেন। উদাহরণস্বরূপ, যদি আমি একটি আছে 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 = 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

ত্রুটি: অবিচ্ছিন্ন প্রকারের বি 1 এবং বি 2। সংকলক 100% সহ জানেন যে কাস্ট সম্ভবত কাজ করতে পারে না। তবে আপনি সংকলককে প্রতারণা করতে পারেন:

B2 b2 = (B2)(A)b1;

তবে যাইহোক রানটাইম এ:

থ্রেড "মূল" java.lang.ClassCastException: B1 কে বি 2 তে কাস্ট করা যায় না Ex

আপনার ক্ষেত্রে:

          (অবজেক্ট)
            / \
(পূর্ণসংখ্যা) (স্ট্রিং)

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(integer)
উরস রিউপকে

@ আরস রিউপকে: ধন্যবাদ, আসলে যখন আমি লিঙ্কটি যুক্ত করার চেষ্টা করছিলাম তখন আমি এটি ভুল লিখেছিলাম।
রানরাগ

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.