Java'da Tamsayı neden String'e dönüştüremiyor?


96

Garip bir istisna buldum:

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

Nasıl mümkün olabilir? Her nesne String'e dönüştürülebilir, değil mi?

Kod:

String myString = (String) myIntegerObject;

Teşekkürler.


11
"Her nesne String'e dönüştürülebilir" - Bu yanlış. Aksine, her nesnenin toString()onu bir String'e dönüştürecek bir yöntemi vardır. Birkaç yanıtın işaret ettiği gibi, kullanmanız gereken budur. (Bazı nesneler toString()için çok kullanışlı bir dizge döndürmez , ancak Integermuhtemelen tam olarak istediğinizi yapar.)
Ted Hopp

2
""+myIntegerObjectAyrıca :) işleri
Salman von Abbas

1
Benim durumumda, bu hata hatalı olarak bildirildi ... Kullanıyordum Integer.toString(IntegerObject)ve bana bu hatayı verdi, ama memnun IntegerObject.toString()... Ve evet, bu gerçekten bir Tamsayı ve bu hatayı gerçekten aldım ...
Andrew

Kaşı onu, sadece String.valueOf()gerçekten işe yarıyor ...
Andrew

Yanıtlar:


157

Bu neden mümkün değil:

Çünkü String ve Integer aynı Object hiyerarşisinde değildir.

      Object
     /      \
    /        \
String     Integer

Denediğiniz döküm, yalnızca aynı hiyerarşide iseler çalışır, örneğin

      Object
     /
    /
   A
  /
 /
B

Bu durumda, (A) objBya (Object) objBya (Object) objAçalışacaktır.

Bu nedenle, diğerlerinin daha önce bahsettiği gibi, bir tamsayıyı dizeye dönüştürmek için şunu kullanın:

String.valueOf(integer)veya Integer.toString(integer)ilkel için

veya

Integer.toString() nesne için.


Peki ya (A) objA, (B) objB ve (B) objA?
su-ex

@ su-ex (B) objAçalışmayacak. (A) objAve (B) objBçalışacak.
Bhushan

Üzgünüz, haklısınız, bu bir ClassCastException sağlar. Diğer ikisi oldukça işe yaramaz ama elbette işe yarayacak.
su-ex

45

Hayır Integerve Stringfarklı türler. Bir tamsayıyı dizeye dönüştürmek için String.valueOf(integer), veya Integer.toString(integer)ilkel Integer.toString()için veya nesne için kullanın.


1
@Ted Hopp - hangisi? İlkel ise ilk ikisini, Tamsayı nesnesiyse üçüncüyü kullanın.
Petar Minchev

Oops. Cevabınızın o son cümlesini görmedim. Yorumumu siliyorum ve bu yanıta olumlu oy veriyorum.
Ted Hopp

1
Benzer (ancak yinelenmeyen) sorun: 'int' bir String'e dönüştürülemez çünkü 'int' bir nesne değildir, String hiyerarşisinde çok daha az.
Kelly

20

İçin inttürleri kullanın:

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

İçin Integertürleri kullanın:

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

Bu, gereksiz bir kutudan çıkarma işlemini zorlar.
Ted Hopp

@Ted Hopp, her bir toString()yöntem türünün ne zaman kullanılacağını açıklığa kavuşturmak için düzenlemelerimi görün
DRiFTy

Sanırım bu son satırString myString = myIntegerObject.toString();
Ted Hopp

6

Hayır. Her nesne a'ya dönüştürülebilir java.lang.Object, a'ya değil String. Herhangi bir nesnenin dizgi temsilini istiyorsanız, toString()yöntemi çağırmanız gerekir ; bu, nesneyi bir String'e çevirmekle aynı değildir .


5

Nesneler , yöntem kullanılarak bir dizeye dönüştürülebilirtoString() :

String myString = myIntegerObject.toString();

Oyuncu seçimi konusunda böyle bir kural yok . Yayınlamanın çalışması için, nesnenin aslında yayınladığınız türde olması gerekir.


5

Bir açıkça bir şey döküm edilemez Stringbir olmadığını String. Şunlardan birini kullanmalısınız:

"" + myInt;

veya:

Integer.toString(myInt);

veya:

String.valueOf(myInt);

İkinci formu tercih ederim ama bence bu kişisel bir seçim.

Düzenle Tamam, işte bu yüzden ikinci formu tercih ediyorum. İlk form, derlendiğinde, a StringBuffer(Java 1.4'te) veya StringBuilder1.5'te örnek oluşturabilir; Çöp toplanacak bir şey daha var. Derleyici bunu anlayabildiğim kadarıyla optimize etmiyor. İkinci formda ayrıca Integer.toString(myInt, radix)onaltılık, sekizlik vb. İsteyip istemediğinizi belirtmenize izin veren bir analog vardır . Kodunuzda tutarlı olmak istiyorsanız (tamamen estetik olarak, sanırım) ikinci form daha fazla yerde kullanılabilir.

Düzenleme 2 Tamsayınızın bir intdeğil , bir olduğunu kastettiğinizi varsaydım Integer. Zaten bir ise Integer, sadece kullanın toString()ve bitirin.


OP, bir Tamsayı nesnesiyle başlıyor. Sadece yapmak çok daha verimli myIntegerObject.toString().
Ted Hopp

4

Dize temsilini istiyorsanız myIntegerObject.toString () 'i çağırmalısınız.


2

Biçimlendirme, resmi olmayan terminoloji kullanmak için Java'da dönüştürmekten farklıdır.

Bir nesneyi çevirmek, o nesnenin zaten onu yayınladığınız şey olduğu ve sadece derleyiciye bunu söylediğiniz anlamına gelir. Bir varsa Örneğin, Fooben bir olduğunu biliyorum referansı FooSubclassörneği, daha sonra (FooSubclass)Foo, derleyici söyler ", örneği değiştirmek sadece bir aslında bilmiyorum FooSubclass.

Öte yandan, bir Integerolduğunu değil bir String(eğer işaret gibi) almak için yöntemler olmasına rağmen, Stringbir temsil ettiğini Integer. Hiçbir örnek yok yana Integerkutu hiç bir olmak String, sen döküm olamaz Integeriçin String.


1

Sizin durumunuzda döküm gerekmiyorsa, toString () çağrısına ihtiyacınız var.

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

Döküm. O nasıl çalışır?

Verilen:

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 ve B aynı miras ağacında ve bunu yapabiliriz:

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

Derleyici, çalışma zamanında muhtemelen çalışabilecek şeylere izin vermelidir. Bununla birlikte, derleyici, dökümün muhtemelen çalışamayacağını% 100 bilirse, derleme başarısız olur.
Verilen:

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

Hata: Dönüştürülemez tipler B1 ve B2. Derleyici, oyuncu kadrosunun muhtemelen işe yaramayacağını% 100 biliyor. Ancak derleyiciyi aldatabilirsiniz:

B2 b2 = (B2)(A)b1;

ama yine de çalışma zamanında:

"Main" iş parçacığında istisna java.lang.ClassCastException: B1, B2'ye dönüştürülemez

Senin durumunda:

          (Nesne)
            / \
(Tamsayı) (Dize)

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

çalışma zamanında: "main" iş parçacığında özel durum java.lang.ClassCastException: java.lang.Integer java.lang.String'e dönüştürülemez



0

Bunun yerine aşağıdaki gibi .toString kullanın:

String myString = myIntegerObject.toString();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.