web-dev-qa-db-de.com

Warum kann in Java keine Ganzzahl in String umgewandelt werden?

Ich habe eine seltsame Ausnahme gefunden:

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

Wie kann das möglich sein? Jedes Objekt kann in String umgewandelt werden, nicht wahr?

Der Code lautet:

String myString = (String) myIntegerObject;

Vielen Dank.

84
user710818

Warum das nicht möglich ist:

Weil sich String und Integer nicht in derselben Objekthierarchie befinden.

      Object
     /      \
    /        \
String     Integer

Das Casting, das Sie versuchen, funktioniert nur, wenn sich diese in derselben Hierarchie befinden, z.

      Object
     /
    /
   A
  /
 /
B

In diesem Fall funktionieren (A) objB oder (Object) objB oder (Object) objA.

Um eine Ganzzahl in eine Zeichenfolge umzuwandeln, verwenden Sie daher wie bereits erwähnt: 

String.valueOf(integer) oder Integer.toString(integer) für primitiv, 

oder  

Integer.toString() für das Objekt. 

137
Bhushan

Nein, Integer und String sind verschiedene Typen. Um eine Ganzzahl in einen String zu konvertieren, verwenden Sie: String.valueOf(integer) oder Integer.toString(integer) für primitive oder Integer.toString() für das Objekt.

45
Petar Minchev

Für int-Typen verwenden Sie:

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

Für Integer-Typen verwenden Sie:

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

Jedes Objekt kann in einen Java.lang.Object und nicht in eine String umgewandelt werden. Wenn Sie eine Zeichenfolgendarstellung für ein beliebiges Objekt wünschen, müssen Sie die toString()-Methode aufrufen. Dies ist nicht dasselbe wie das Umwandeln des Objekts in einen String.

6
andri

Sie können nichts explizit in eine String umwandeln, die keine String ist. Sie sollten entweder verwenden:

"" + myInt;

oder:

Integer.toString(myInt);

oder:

String.valueOf(myInt);

Ich bevorzuge die zweite Form, aber ich denke, es ist eine persönliche Entscheidung.

Bearbeiten OK, ich bevorzuge die zweite Form. Das erste Formular könnte beim Kompilieren eine StringBuffer (in Java 1.4) oder eine StringBuilder in 1.5 instanziieren. eine weitere Sache, Müll gesammelt zu werden. Der Compiler optimiert das nicht, soweit ich das beurteilen konnte. Das zweite Formular hat auch ein Analogon Integer.toString(myInt, radix), mit dem Sie angeben können, ob Sie Hex, Oktal usw. möchten. Wenn Sie in Ihrem Code konsistent sein möchten (rein ästhetisch, denke ich), kann das zweite Formular an mehreren Stellen verwendet werden.

Edit 2 Ich nahm an, du meintest, dass deine Ganzzahl eine int und keine Integer war. Wenn es bereits eine Integer ist, verwenden Sie einfach toString() und sind fertig.

5
Jonathan

Sie sollten myIntegerObject.toString () aufrufen, wenn Sie die Zeichenfolgendarstellung möchten.

4
Savino Sguera

Objekte können konvertiert mit der toString()-Methode in einen String umgewandelt werden:

String myString = myIntegerObject.toString();

Es gibt keine solche Regel über Casting. Damit das Casting funktioniert, muss das Objekt tatsächlich von dem Typ sein, in den Sie werfen.

4
millimoose

Casting unterscheidet sich von der Konvertierung in Java, um informelle Terminologie zu verwenden.

Das Casting eines Objekts bedeutet, dass das Objekt bereits das ist, worauf Sie es werfen und Sie dem Compiler nur davon erzählen. Wenn ich beispielsweise eine Foo-Referenz habe, von der ich weiß, dass sie eine FooSubclass-Instanz ist, sagt (FooSubclass)Foo dem Compiler: "Ändern Sie nicht die Instanz, sondern wissen Sie, dass es sich tatsächlich um eine FooSubclass handelt.

Andererseits ist eine Integer nicht eine String, obwohl (wie Sie darauf hinweisen) es Methoden gibt, um eine String zu erhalten, die eine Integer darstellt. Da keine Instanz von Integer jemals eine String sein kann, können Sie Integer nicht in String umwandeln.

2
yshavit

Wenn Sie kein Casting benötigen, müssen Sie toString () aufrufen.

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

Casting Wie funktioniert es?

Gegeben:

class A {}
class B extends A {}

(EIN)
|
(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 und B im selben Vererbungsbaum und wir können dies:

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

Der Compiler muss Dinge zulassen, die möglicherweise zur Laufzeit funktionieren. Wenn der Compiler jedoch zu 100% weiß, dass der Cast möglicherweise nicht funktioniert, schlägt die Kompilierung fehl .
Gegeben:

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

(EIN)
/ \
(B1) (B2)

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

Fehler: Nicht konvertierbare Typen B1 und B2 ..__ Der Compiler weiß mit 100%, dass der Cast möglicherweise nicht funktioniert. Aber Sie können den Compiler betrügen:

B2 b2 = (B2)(A)b1;

aber trotzdem zur Laufzeit:

Ausnahme im Thread "main" Java.lang.ClassCastException: B1 kann nicht in B2 umgewandelt werden

in Ihrem Fall:

(Objekt)
/ \
(Ganzzahl) (String)

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

zur Laufzeit: Ausnahme im Thread "main" Java.lang.ClassCastException: Java.lang.Integer kann nicht in Java.lang.String umgewandelt werden

1
Dmitry Sokolyuk

Verwenden Sie stattdessen .toString wie folgt:

String myString = myIntegerObject.toString();
0
A.Aleem11

Verwenden Sie String.valueOf (Ganzzahl) .

Es gibt eine Zeichenfolgendarstellung von Ganzzahl zurück.

0
RanRag