2012-01-23 13 views
76

He encontrado alguna extraña excepción:¿Por qué no se puede convertir enteros a cadenas en java?

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

¿Cómo puede ser posible? Cada objeto puede ser enviado a String, ¿no es así?

El código es:

String myString = (String) myIntegerObject; 

Gracias.

+10

_ "Cada objeto se puede lanzar a Cadena "_ -- Esto está mal. Por el contrario, cada objeto tiene un método 'toString()' que lo convertirá en una Cadena. Como varias respuestas señalan, eso es lo que debes usar. (Para algunos objetos, 'toString()' no devuelve una cadena muy útil, pero para 'Integer', probablemente haga exactamente lo que usted desea). –

+0

' "" + myIntegerObject' también funciona :) –

Respuesta

129

Por qué esto no es posible:

Porque Cadena y entero no están en la misma jerarquía de objetos.

 Object 
    / \ 
    /  \ 
String  Integer 

La conversión que está intentando funciona solo si están en la misma jerarquía, p.

 Object 
    /
    /
    A 
/
/
B 

En este caso, (A) objB o (Object) objB o (Object) objA va a funcionar.

Por lo tanto como otros han mencionado ya, para convertir un entero a uso de cadena:

String.valueOf(integer), o Integer.toString(integer) para primitivo,

o

Integer.toString() para el objeto.

+0

¿Qué hay de (A) objA, (B) objB y (B) objA? –

+0

@ su-ex '(B) objA' no funcionará. '(A) objA' y' (B) objB' funcionarán. – Bhushan

+0

Lo sentimos, tienes razón, esto da una ClassCastException. Los otros dos son bastante inútiles pero funcionarán, por supuesto. –

44

No, Integer y String son tipos diferentes. Para convertir un entero en un uso de cadena: String.valueOf(integer), o Integer.toString(integer) para primitiva, o Integer.toString() para el objeto.

+1

@Ted Hopp - ¿cúal? Si es un uso primitivo los dos primeros, si es el objeto Integer usa el tercero. –

+0

Vaya. No vi la última frase de tu respuesta. Estoy eliminando mi comentario y votando esta respuesta. –

+1

Problema similar (pero no duplicado): un ['int' no se puede convertir a una cadena] (http://stackoverflow.com/questions/4105655/problems-converting-integer-to-string) porque 'int' es no es un objeto, y mucho menos en la jerarquía de Cadenas. –

4

Debe llamar a myIntegerObject.toString() si desea la representación de cadena.

5

No. Todos los objetos se pueden convertir en java.lang.Object, no en String. Si desea una representación de cadena de cualquier objeto, debe invocar el método toString(); esto es no lo mismo que lanzar el objeto a una Cadena.

19

Para int tipos utilizan:

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

Para Integer tipos utilizan:

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

Esto fuerza una operación de desembalaje innecesaria. –

+0

@Ted Hopp ver mis ediciones para aclarar cuándo usar cada tipo de método 'toString()' – DRiFTy

+0

Creo que la última línea debería ser 'String myString = myIntegerObject.toString();' –

5

No se puede convertir explícitamente nada a un String que no es un String. Debe utilizar ya sea:

"" + myInt; 

o:

Integer.toString(myInt); 

o:

String.valueOf(myInt); 

Yo prefiero la segunda forma, pero creo que es una elección personal.

Editar Bien, aquí es por qué prefiero el segundo formulario. El primer formulario, cuando se compila, puede crear una instancia de StringBuffer (en Java 1.4) o StringBuilder en 1.5; una cosa más para ser basura recolectada. El compilador no optimiza esto por lo que pude ver. La segunda forma también tiene un análogo, Integer.toString(myInt, radix) que le permite especificar si desea hexadecimal, octal, etc. Si quiere ser coherente en su código (puramente estético, supongo), la segunda forma puede usarse en más lugares.

Editar 2 supuse que quería decir que su número entero era un int y no un Integer. Si ya es un Integer, simplemente use toString() y termine.

+0

OP está comenzando con un objeto Entero. Es mucho más eficiente hacer 'myIntegerObject.toString()'. –

3

Los objetos pueden ser convertidos a una cadena utilizando el método toString():

String myString = myIntegerObject.toString(); 

No hay tal regla sobre fundición.Para que el casting funcione, el objeto debe ser del tipo al que estás lanzando.

0

Use String.valueOf(integer).

Devuelve una representación de cadena de entero.

+0

Como dice Petar arriba, debería ser '' String.valueOf (integer) '' –

+0

@UrsReupke: gracias, en realidad cuando estaba tratando de agregar el enlace, lo reescribí mal. – RanRag

1

La conversión es diferente a la conversión en Java, para utilizar terminología informal.

Casting de un objeto significa que ese objeto ya es lo que lo estás creando, y solo le dices al compilador al respecto. Por ejemplo, si tengo una referencia Foo que sé que es una instancia de FooSubclass, a continuación, (FooSubclass)Foo le dice al compilador, "no cambie la instancia, sólo sé que en realidad es un FooSubclass.

Por otro lado, un Integer es no un String, aunque (como usted señala) existen métodos para conseguir un String que representa un Integer. Dado que ninguna ninguna instancia de Integer nunca puede ser un String, no se puede convertir a IntegerString.

1

En su caso, no necesita conversión, necesita llamar a String().

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

Fundición. ¿Como funciona?

dado:

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 y B en el mismo árbol de herencia y podremos esto:

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

el compilador debe permitir que las cosas que posiblemente podrían funcionar en tiempo de ejecución . Sin embargo, si el compilador sabe con un 100% que el molde no podría funcionar, la compilación fallará.
Dado:

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 

de error: no convertible tipos B1 y B2. El compilador sabe con un 100% que el yeso no podría funcionar. Pero se puede engañar al compilador:

B2 b2 = (B2)(A)b1; 

pero de todos modos en tiempo de ejecución:

Excepción en el hilo "principal" java.lang.ClassCastException: B1 no se puede convertir a B2

en su caso:

          (Object)
            /       \
(Integer)       (String)

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

en tiempo de ejecución: Excepción en el enhebrar java.lang.ClassCastException "principal": java.lang.Integer no se puede convertir a java.lang.String

0

Uso .toString lugar, como a continuación:

String myString = myIntegerObject.toString(); 
Cuestiones relacionadas