我发现了一些奇怪的例外:
java.lang.ClassCastException: java.lang.Integer
cannot be cast to java.lang.String
怎么可能?每个对象都可以转换为String,不是吗?
代码是:
String myString = (String) myIntegerObject;
感谢。
答案 0 :(得分:142)
为什么这是不可能的:
因为String和Integer不在同一个Object层次结构中。
Object
/ \
/ \
String Integer
您正在尝试的转换只有在它们位于同一层次结构中时才有效,例如
Object
/
/
A
/
/
B
在这种情况下,(A) objB
或(Object) objB
或(Object) objA
将有效。
因此,正如其他人已经提到的,要将整数转换为字符串使用:
String.valueOf(integer)
或Integer.toString(integer)
原语,
或
对象的 Integer.toString()
。
答案 1 :(得分:45)
不,Integer
和String
是不同的类型。要将整数转换为字符串,请使用:String.valueOf(integer)
或原始Integer.toString(integer)
或对象Integer.toString()
。
答案 2 :(得分:20)
对于int
类型,请使用:
int myInteger = 1;
String myString = Integer.toString(myInteger);
对于Integer
类型,请使用:
Integer myIntegerObject = new Integer(1);
String myString = myIntegerObject.toString();
答案 3 :(得分:6)
没有。每个对象都可以投放到java.lang.Object
,而不是String
。如果你想要一个任何对象的字符串表示,你必须调用toString()
方法;这与不与将对象转换为String相同。
答案 4 :(得分:5)
您无法明确地向String
投放任何不是String
的内容。你应该使用:
"" + myInt;
或:
Integer.toString(myInt);
或:
String.valueOf(myInt);
我更喜欢第二种形式,但我认为这是个人选择。
编辑好的,这就是为什么我更喜欢第二种形式。第一种形式在编译时可以实例化StringBuffer
(在Java 1.4中)或StringBuilder
在1.5中;还有一件事要收集垃圾。据我所知,编译器没有对此进行优化。第二种形式也有一个模拟Integer.toString(myInt, radix)
,它允许你指定是否需要十六进制,八进制等。如果你想在你的代码中保持一致(纯粹在美学上,我猜)第二种形式可以用于更多地方。
编辑2 我认为您的意思是整数是int
而不是Integer
。如果它已经是Integer
,只需在其上使用toString()
即可完成。
答案 5 :(得分:4)
如果需要字符串表示,则应调用myIntegerObject.toString()。
答案 6 :(得分:4)
可以使用toString()
方法将对象转换为字符串:
String myString = myIntegerObject.toString();
施放没有这样的规则。要使转换工作,对象实际上必须是您要转换的类型。
答案 7 :(得分:2)
Casting与使用Java转换不同,使用非正式术语。
转换对象意味着对象已经是你所投射的对象,而你只是告诉编译器它。例如,如果我有一个Foo
引用,我知道它是一个FooSubclass
实例,那么(FooSubclass)Foo
告诉编译器,“不要更改实例,只知道它实际上是一个{ {1}}。
另一方面,FooSubclass
不一个Integer
,尽管(正如您所指出的)有一些获取代表String
的方法String
。由于Integer
的任何实例都不能成为Integer
,因此您无法将String
投射到Integer
。
答案 8 :(得分:1)
在你的情况下不需要强制转换,你需要调用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;
但无论如何在运行时:
线程“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
答案 9 :(得分:0)
返回整数的字符串表示。
答案 10 :(得分:0)
Use .toString instead like below:
String myString = myIntegerObject.toString();