В вашем случае не требуется приведение, вам нужно вызвать toString ().
Integer i = 33;
String s = i.toString();
//or
s = String.valueOf(i);
//or
s = "" + i;
литье. Как это работает?
Дано:
class A {}
class B extends 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 и B в одном и том же дереве наследования, и мы можем это:
a = new A();
b = (B)a; // again downcast. Compiles but fails later, at runtime: java.lang.ClassCastException
Компилятор должен разрешать вещи, которые могут работать во время выполнения. Однако, если компилятор на 100% знает, что приведение не может работать, компиляция завершится неудачно.
Дано:
class A {}
class B1 extends A {}
class B2 extends A {}
(А)
/ \
(B1) (B2)
B1 b1 = new B1();
B2 b2 = (B2)b1; // B1 can't ever be a B2
Ошибка: необратимые типы B1 и B2.
Компилятор на 100% знает, что приведение не может работать. Но вы можете обмануть компилятор:
B2 b2 = (B2)(A)b1;
но в любом случае во время выполнения:
Исключение в потоке "main" java.lang.ClassCastException: B1 не может быть приведено к B2
в вашем случае:
(Объект)
/ \
(Целое число) (Строка)
Integer i = 33;
//String s = (String)i; - compiler error
String s = (String)(Object)i;
во время выполнения: исключение в потоке "main" java.lang.ClassCastException: java.lang.Integer нельзя преобразовать в java.lang.String