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.
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.
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.
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();
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.
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.
Vous devez appeler myIntegerObject.toString () si vous voulez la représentation sous forme de chaîne.
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.
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
.
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
Utilisez .toString à la place comme ci-dessous:
String myString = myIntegerObject.toString();
Utilisez String.valueOf (integer) .
Il retourne une représentation sous forme de chaîne de nombre entier.