Mengapa Integer tidak dapat ditransmisikan ke String di java?

95

Saya menemukan beberapa pengecualian aneh:

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

Bagaimana mungkin? Tiap objek bisa dicor ke String, bukan?

Kodenya adalah:

String myString = (String) myIntegerObject;

Terima kasih.

pengguna710818
sumber
11
"Setiap objek dapat dicor ke String" - Ini salah. Sebaliknya, setiap objek memiliki toString()metode yang akan mengubahnya menjadi String. Seperti yang ditunjukkan oleh beberapa jawaban, itulah yang harus Anda gunakan. (Untuk beberapa objek, toString()tidak mengembalikan string yang sangat berguna , tetapi untuk Integer, itu mungkin melakukan apa yang Anda inginkan.)
Ted Hopp
2
""+myIntegerObjectjuga bekerja :)
Salman von Abbas
1
Dalam kasus saya, kesalahan ini dilaporkan karena kesalahan ... Saya menggunakan Integer.toString(IntegerObject)dan itu memberi saya kesalahan ini, tetapi senang dengan IntegerObject.toString()... Dan ya, itu benar-benar Integer, dan saya benar-benar mendapatkan kesalahan ini ...
Andrew
Gores itu, hanya String.valueOf()benar-benar bekerja ...
Andrew

Jawaban:

155

Mengapa ini tidak mungkin:

Karena String dan Integer tidak berada dalam hierarki Objek yang sama.

      Object
     /      \
    /        \
String     Integer

Pengecoran yang Anda coba, hanya berfungsi jika berada dalam hierarki yang sama, mis

      Object
     /
    /
   A
  /
 /
B

Dalam hal ini, (A) objBatau (Object) objBatau (Object) objAakan bekerja.

Karenanya seperti yang telah disebutkan orang lain, untuk mengonversi bilangan bulat menjadi string digunakan:

String.valueOf(integer), atau Integer.toString(integer)untuk primitif,

atau

Integer.toString() untuk objeknya.

Bhushan
sumber
Bagaimana dengan (A) objA, (B) objB dan (B) objA?
su-ex
@ su-ex (B) objAtidak akan bekerja. (A) objAdan (B) objBakan bekerja.
Bhushan
Maaf, Anda benar, ini memberikan ClassCastException. Dua lainnya sangat tidak berguna tetapi tentu saja akan berhasil.
su-ex
45

Tidak, Integerdan Stringberbeda tipe. Untuk mengonversi integer menjadi string, gunakan:, String.valueOf(integer)atau Integer.toString(integer)untuk primitif, atau Integer.toString()untuk objek.

Petar Minchev
sumber
1
@ Ted Hopp - yang mana? Jika itu primitif, gunakan dua yang pertama, jika itu adalah objek Integer gunakan yang ketiga.
Petar Minchev
Ups. Saya tidak melihat kalimat terakhir dari jawaban Anda. Saya menghapus komentar saya dan memberi suara positif pada jawaban ini.
Ted Hopp
1
Masalah serupa (tapi bukan duplikat): 'int' tidak dapat ditransmisikan ke String karena 'int' bukan objek, apalagi dalam hierarki String.
Kelly S. French
20

Untuk intjenis penggunaan:

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

Untuk Integerjenis penggunaan:

Integer myIntegerObject = new Integer(1);
String myString = myIntegerObject.toString();
KEREN
sumber
Ini memaksa operasi unboxing yang tidak perlu.
Ted Hopp
@Ted Hopp melihat hasil edit saya untuk mengklarifikasi kapan harus menggunakan setiap jenis toString()metode
DRiFTy
Saya pikir baris terakhir seharusnyaString myString = myIntegerObject.toString();
Ted Hopp
6

Tidak. Setiap benda dapat dicor ke java.lang.Object, bukan a String. Jika Anda menginginkan representasi string dari objek apa pun, Anda harus memanggil toString()metode; ini tidak sama dengan mentransmisikan objek ke String.

andri
sumber
5

Objek dapat diubah menjadi string menggunakan toString()metode:

String myString = myIntegerObject.toString();

Tidak ada aturan seperti itu tentang casting . Agar casting berfungsi, objek harus benar-benar jenis yang Anda tuju.

millimoose.dll
sumber
5

Anda tidak dapat mentransmisikan secara eksplisit apa pun ke Stringyang bukan String. Anda harus menggunakan:

"" + myInt;

atau:

Integer.toString(myInt);

atau:

String.valueOf(myInt);

Saya lebih suka bentuk kedua, tapi saya pikir itu pilihan pribadi.

Edit OK, inilah mengapa saya lebih suka bentuk kedua. Bentuk pertama, ketika dikompilasi, bisa memberi contoh a StringBuffer(di Java 1.4) atau a StringBuilderdi 1.5; satu hal lagi yang harus dikumpulkan sampah. Sejauh yang saya tahu, kompilator tidak mengoptimalkannya. Bentuk kedua juga memiliki analog, Integer.toString(myInt, radix)yang memungkinkan Anda menentukan apakah Anda ingin hex, oktal, dll. Jika Anda ingin konsisten dalam kode Anda (secara estetika, saya rasa) formulir kedua dapat digunakan di lebih banyak tempat.

Sunting 2 Saya berasumsi yang Anda maksud bahwa bilangan bulat Anda adalah an intdan bukan Integer. Jika sudah Integer, gunakan toString()saja dan selesai.

Jonathan
sumber
OP dimulai dengan objek Integer. Jauh lebih efisien untuk melakukannya myIntegerObject.toString().
Ted Hopp
4

Anda harus memanggil myIntegerObject.toString () jika Anda menginginkan representasi string.

Savino Sguera
sumber
2

Pengecoran berbeda dengan konversi di Jawa, menggunakan terminologi informal.

Mentransmisikan objek berarti objek tersebut sudah menjadi tujuan Anda mentransmisikannya, dan Anda hanya memberi tahu kompiler tentangnya. Misalnya, jika saya memiliki Fooreferensi yang saya tahu adalah sebuah FooSubclassinstance, lalu (FooSubclass)Foomemberi tahu compiler, "jangan ubah instance tersebut, ketahuilah bahwa itu sebenarnya a FooSubclass.

Di sisi lain, Integeradalah tidak satu String, meskipun (seperti yang Anda tunjukkan) ada metode untuk mendapatkan Stringyang mewakili Integer. Karena tidak ada contoh dari yang Integerdapat menjadi String, Anda tidak dapat mentransmisikan Integerke String.

yshavit
sumber
1

Jika Anda tidak membutuhkan transmisi, Anda perlu memanggil toString ().

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

Pengecoran. Bagaimana cara kerjanya?

Diberikan:

class A {}
class B extends A {}

(A)
  |
(B)

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 dan B dalam pohon warisan yang sama dan kita dapat melakukannya:

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

Kompilator harus mengizinkan hal-hal yang mungkin berfungsi saat runtime. Namun, jika kompilator mengetahui dengan 100% bahwa cast tidak mungkin bekerja, kompilasi akan gagal.
Diberikan:

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

        (A)
      / \
(B1) (B2)

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

Kesalahan: Tipe B1 dan B2 yang tidak dapat diubah. Kompilator mengetahui dengan 100% bahwa cast tidak mungkin bekerja. Tetapi Anda bisa menipu kompiler:

B2 b2 = (B2)(A)b1;

tetapi bagaimanapun juga saat runtime:

Pengecualian di utas "main" java.lang.ClassCastException: B1 tidak dapat ditransmisikan ke B2

dalam kasus Anda:

          (Objek)
            / \
(Integer) (String)

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

saat runtime: Pengecualian di thread "main" java.lang.ClassCastException: java.lang.Integer tidak dapat ditransmisikan ke java.lang.String

Dmitry Sokolyuk
sumber
0

Gunakan String.valueOf (integer) .

Ini mengembalikan representasi string dari integer.

RanRag
sumber
Seperti yang dikatakan Petar di atas, itu seharusnyaString.valueOf(integer)
Urs Reupke
@UrsReupke: terima kasih, sebenarnya ketika saya mencoba menambahkan tautan saya menulis ulang yang salah.
RanRag
0

Gunakan .toString sebagai gantinya seperti di bawah ini:

String myString = myIntegerObject.toString();
A.leem 11
sumber