如果您不需要强制转换,则需要调用toString()。
Integer i = 33;
String s = i.toString();
//or
s = String.valueOf(i);
//or
s = "" + i;
铸件。它是如何工作的?
鉴于:
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和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 {}
(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;
但无论如何在运行时:
线程“主”中的异常java.lang.ClassCastException:无法将B1强制转换为B2
在您的情况下:
(对象)
/ \
(整数)(字符串)
Integer i = 33;
//String s = (String)i; - compiler error
String s = (String)(Object)i;
在运行时:线程“主”中的异常java.lang.ClassCastException:无法将java.lang.Integer强制转换为java.lang.String
toString()
将其转换为字符串的方法。正如几个答案指出的那样,这就是您应该使用的。(对于某些对象,toString()
不会返回非常有用的字符串,但是对于Integer
,它可能恰好满足您的要求。)