Por que não é possível converter Integer em String em java?

95

Encontrei alguma exceção estranha:

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

Como isso pode ser possível? Cada objeto pode ser lançado em String, não é?

O código é:

String myString = (String) myIntegerObject;

Obrigado.

user710818
fonte
11
"Cada objeto pode ser convertido em String" - Isso está errado. Em vez disso, cada objeto possui um toString()método que o converterá em String. Como várias respostas apontam, é isso que você deve usar. (Para alguns objetos, toString()não retorna uma string muito útil , mas para Integer, provavelmente faz exatamente o que você deseja.)
Ted Hopp
2
""+myIntegerObjecttambém funciona :)
Salman von Abbas
1
No meu caso, esse erro foi relatado como falha ... Eu estava usando Integer.toString(IntegerObject)e me deu esse erro, mas estou feliz com IntegerObject.toString()... E sim, isso realmente é um inteiro, e eu realmente recebi esse erro ...
Andrew
Raspe isso, só String.valueOf()funciona realmente ...
Andrew,

Respostas:

155

Por que isso não é possível:

Porque String e Integer não estão na mesma hierarquia de Objetos.

      Object
     /      \
    /        \
String     Integer

O elenco que você está tentando, só funciona se eles estiverem na mesma hierarquia, por exemplo

      Object
     /
    /
   A
  /
 /
B

Nesse caso, (A) objBou (Object) objBou (Object) objAfuncionará.

Portanto, como outros já mencionaram, para converter um inteiro em uma string, use:

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

ou

Integer.toString() para o objeto.

Bhushan
fonte
E quanto a (A) objA, (B) objB e (B) objA?
su-ex
@ su-ex (B) objAnão funcionará. (A) objAe (B) objBvai funcionar.
Bhushan
Desculpe, você está certo, isso dá uma ClassCastException. Os outros dois são completamente inúteis, mas funcionarão, é claro.
su-ex
45

Não, Integere Stringsão de tipos diferentes. Para converter um inteiro em string, use:, String.valueOf(integer)ou Integer.toString(integer)para primitivo, ou Integer.toString()para o objeto.

Petar Minchev
fonte
1
@Ted Hopp - qual? Se for um objeto primitivo use os dois primeiros, se for o objeto Integer use o terceiro.
Petar Minchev
Opa. Não vi a última frase da sua resposta. Estou excluindo meu comentário e aprovando esta resposta.
Ted Hopp
1
Problema semelhante (mas não duplicado): um 'int' não pode ser convertido em uma String porque um 'int' não é um objeto, muito menos na hierarquia de String.
Kelly S. French
20

Para inttipos, use:

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

Para Integertipos, use:

Integer myIntegerObject = new Integer(1);
String myString = myIntegerObject.toString();
DRiFTy
fonte
Isso força uma operação de desembalagem desnecessária.
Ted Hopp
@Ted Hopp veja minhas edições para esclarecer quando usar cada tipo de toString()método
DRiFTy
Acho que a última linha deveria serString myString = myIntegerObject.toString();
Ted Hopp
6

Não. Cada objeto pode ser convertido para um java.lang.Object, não um String. Se você quiser uma representação de string de qualquer objeto, deverá invocar o toString()método; isso não é o mesmo que lançar o objeto em uma String.

andri
fonte
5

Os objetos podem ser convertidos em uma string usando o toString()método:

String myString = myIntegerObject.toString();

Não existe essa regra sobre o elenco . Para que a projeção funcione, o objeto deve realmente ser do tipo para o qual você está projetando.

milimoose
fonte
5

Você não pode lançar explicitamente nada para um Stringque não seja um String. Você deve usar:

"" + myInt;

ou:

Integer.toString(myInt);

ou:

String.valueOf(myInt);

Prefiro a segunda forma, mas acho que é uma escolha pessoal.

Editar OK, é por isso que prefiro a segunda forma. A primeira forma, quando compilada, poderia instanciar a StringBuffer(em Java 1.4) ou a StringBuilderem 1.5; mais uma coisa a ser coletada no lixo. O compilador não otimiza isso, tanto quanto eu poderia dizer. A segunda forma também tem um análogo, Integer.toString(myInt, radix)que permite que você especifique se deseja hex, octal, etc. Se você quiser ser consistente em seu código (puramente esteticamente, eu acho), a segunda forma pode ser usada em mais lugares.

Editar 2 Presumi que você quis dizer que seu inteiro era um inte não um Integer. Se já for um Integer, basta usar toString()nele e pronto.

Jonathan
fonte
OP está começando com um objeto Integer. É muito mais eficiente apenas fazer myIntegerObject.toString().
Ted Hopp
4

Você deve chamar myIntegerObject.toString () se quiser a representação de string.

Savino Sguera
fonte
2

Casting é diferente de converter em Java, para usar uma terminologia informal.

Casting um objeto significa que esse objeto já é o que você está lançando, e você está apenas contando ao compilador sobre isso. Por exemplo, se eu tiver uma Fooreferência que sei ser uma FooSubclassinstância, (FooSubclass)Foodiga ao compilador: "não altere a instância, apenas saiba que é realmente um FooSubclass.

Por outro lado, um nãoInteger é um , embora (como você assinalou) existam métodos para obter um que represente um . Como nenhuma instância de pode ser um , você não pode lançar para .StringStringIntegerIntegerStringIntegerString

Yshavit
fonte
1

No seu caso, não precisa de conversão, você precisa chamar toString ().

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

Casting. 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 e B na mesma árvore de herança e podemos:

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

O compilador deve permitir coisas que podem funcionar em tempo de execução. No entanto, se o compilador souber com 100% que o elenco não poderia funcionar, a compilação falhará.
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

Erro: tipos não conversíveis B1 e B2. O compilador sabe com 100% que o elenco não poderia funcionar. Mas você pode enganar o compilador:

B2 b2 = (B2)(A)b1;

mas de qualquer maneira em tempo de execução:

Exceção no thread "principal" java.lang.ClassCastException: B1 não pode ser convertido para B2

no seu caso:

          (Objeto)
            / \
(Inteiro) (String)

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

no tempo de execução: Exceção no thread "main" java.lang.ClassCastException: java.lang.Integer não pode ser convertido em java.lang.String

Dmitry Sokolyuk
fonte
0

Use String.valueOf (inteiro) .

Ele retorna uma representação de string de inteiro.

RanRag
fonte
Como Petar disse acima, deveria serString.valueOf(integer)
Urs Reupke
@UrsReupke: obrigado, na verdade, quando eu estava tentando adicionar o link, reescrevi errado.
RanRag
0

Use .toString ao invés como abaixo:

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