web-dev-qa-db-fra.com

Pourquoi ne peut-on pas convertir Integer en String en java?

J'ai trouvé une exception étrange:

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

Comment cela peut être possible? Chaque objet peut être converti en chaîne, n'est-ce pas?

Le code est:

String myString = (String) myIntegerObject;

Merci.

84
user710818

Pourquoi ce n'est pas possible:

Parce que String et Integer ne font pas partie de la même hiérarchie d'objets.

      Object
     /      \
    /        \
String     Integer

Le casting que vous essayez ne fonctionne que s’ils sont dans la même hiérarchie, par exemple.

      Object
     /
    /
   A
  /
 /
B

Dans ce cas, (A) objB ou (Object) objB ou (Object) objA fonctionnera.

Par conséquent, comme d'autres l'ont déjà mentionné, pour convertir un entier en chaîne, utilisez: 

String.valueOf(integer), ou Integer.toString(integer) pour la primitive, 

ou  

Integer.toString() pour l'objet. 

137
Bhushan

Non, Integer et String sont de types différents. Pour convertir un entier en chaîne, utilisez: String.valueOf(integer) ou Integer.toString(integer) pour primitive ou Integer.toString() pour l'objet.

45
Petar Minchev

Pour les types int, utilisez:

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

Pour les types Integer, utilisez:

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

Non. Chaque objet peut être converti en un Java.lang.Object et non une String. Si vous voulez une représentation sous forme de chaîne de n'importe quel objet, vous devez invoquer la méthode toString(); c'est pas la même chose que de transformer l'objet en String.

6
andri

Vous ne pouvez pas explicitement transtyper quoi que ce soit sur une String qui n'est pas une String. Vous devez utiliser soit:

"" + myInt;

ou:

Integer.toString(myInt);

ou:

String.valueOf(myInt);

Je préfère la deuxième forme, mais je pense que c'est un choix personnel.

Éditer OK, voici pourquoi je préfère le second formulaire. Le premier formulaire, une fois compilé, pourrait instancier une StringBuffer (en Java 1.4) ou une StringBuilder dans 1.5; une dernière chose à ramasser. Le compilateur n'optimise pas cela autant que je sache. La seconde forme a aussi un analogue, Integer.toString(myInt, radix) qui vous permet de spécifier si vous voulez être hexadécimal, octal, etc. Si vous voulez être cohérent dans votre code (purement esthétique, je suppose), la seconde forme peut être utilisée à plusieurs endroits.

Edit 2 J'ai supposé que vous vouliez dire que votre entier était une int et non une Integer. Si c'est déjà un Integer, utilisez simplement toString() dessus et soyez prêt.

5
Jonathan

Vous devez appeler myIntegerObject.toString () si vous voulez la représentation sous forme de chaîne.

4
Savino Sguera

Les objets peuvent être convertis _ en chaîne à l'aide de la méthode toString():

String myString = myIntegerObject.toString();

Il n'y a pas de telle règle sur casting. Pour que le casting fonctionne, l’objet doit en réalité correspondre au type de casting.

4
millimoose

La conversion est différente de la conversion en Java, pour utiliser une terminologie informelle.

Lancer un objet signifie que cet objet est déjà son objectif, et vous ne faites que le dire au compilateur. Par exemple, si j'ai une référence Foo que je sais être une instance FooSubclass, alors (FooSubclass)Foo indique au compilateur, "ne changez pas l'instance, sachez simplement qu'il s'agit en réalité d'une FooSubclass.

D'autre part, une Integer est pas a String, bien que (comme vous le signalez), il existe des méthodes pour obtenir une String qui représente une Integer. Dans la mesure où aucune instance de Integer ne peut jamais être une String, vous ne pouvez pas transtyper Integer en String.

2
yshavit

Dans votre cas, vous n'avez pas besoin de casting, vous devez appeler toString ().

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

Moulage. Comment ça marche?

Donné:

class A {}
class B extends A {}

(UNE)
|
(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 et B dans le même arbre d'héritage et nous pouvons ceci:

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

Le compilateur doit autoriser des éléments susceptibles de fonctionner au moment de l'exécution. Cependant, si le compilateur sait à 100% que la distribution ne pourrait pas fonctionner, la compilation échouera .
Donné:

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

(UNE)
/ \
(B1) (B2)

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

Erreur: Types Inconvertible B1 et B2 . Le compilateur sait à 100% que la distribution ne pourrait pas fonctionner. Mais vous pouvez tromper le compilateur:

B2 b2 = (B2)(A)b1;

mais de toute façon au moment de l'exécution:

Exception dans le thread "principal" Java.lang.ClassCastException: B1 ne peut pas être converti en B2

dans ton cas:

(Objet)
/ \
(Entier) (Chaîne)

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

au moment de l'exécution: exception dans le fil "principal" Java.lang.ClassCastException: Java.lang.Integer ne peut pas être converti en Java.lang.String

1
Dmitry Sokolyuk

Utilisez .toString à la place comme ci-dessous:

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

Utilisez String.valueOf (integer) .

Il retourne une représentation sous forme de chaîne de nombre entier.

0
RanRag