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
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 paraInteger
, provavelmente faz exatamente o que você deseja.)