为什么在java中不能将整数转换为字符串?
我发现了一些奇怪的例外:为什么在java中不能将整数转换为字符串?,java,string,casting,integer,Java,String,Casting,Integer,我发现了一些奇怪的例外: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String 怎么可能呢?每个物体都可以铸成字符串,不是吗 代码是: String myString = (String) myIntegerObject; 谢谢。不,整数和字符串是不同的类型。若要将整数转换为字符串,请使用:string.valueOf(integer),或integer.toString(in
java.lang.ClassCastException: java.lang.Integer
cannot be cast to java.lang.String
怎么可能呢?每个物体都可以铸成字符串,不是吗
代码是:
String myString = (String) myIntegerObject;
谢谢。不,
整数和字符串是不同的类型。若要将整数转换为字符串,请使用:string.valueOf(integer)
,或integer.toString(integer)
用于原语,或integer.toString()
用于对象。如果需要字符串表示,应调用myIntegerObject.toString()。否。每个对象都可以强制转换为java.lang.object
,不是字符串
。如果想要任何对象的字符串表示,必须调用toString()
方法;这与将对象强制转换为字符串不同。对于int
类型,请使用:
int myInteger = 1;
String myString = Integer.toString(myInteger);
Integer myIntegerObject = new Integer(1);
String myString = myIntegerObject.toString();
对于Integer
类型,请使用:
int myInteger = 1;
String myString = Integer.toString(myInteger);
Integer myIntegerObject = new Integer(1);
String myString = myIntegerObject.toString();
不能将任何内容显式强制转换为非字符串的字符串。您应该使用以下任一选项:
"" + myInt;
或:
或:
我更喜欢第二种形式,但我认为这是个人的选择
编辑好的,这就是为什么我喜欢第二种形式。第一个表单在编译时可以实例化StringBuffer
(在Java1.4中)或StringBuilder
(在1.5中);还有一件事需要垃圾收集。据我所知,编译器并没有对此进行优化。第二种形式也有一个类似的,Integer.toString(myInt,radix)
,它允许您指定是否需要十六进制、八进制等。如果您想在代码中保持一致(我想纯粹是美学上的一致),第二种形式可以在更多的地方使用
编辑2我假设您的意思是您的整数是int
而不是integer
。如果它已经是一个整数
,只需对其使用toString()
,即可完成。可以使用toString()
方法将对象转换为字符串:
String myString = myIntegerObject.toString();
铸造方面没有这样的规定。要使强制转换生效,对象必须是您要强制转换到的类型。使用
它返回整数的字符串表示形式。在Java中使用非正式术语时,强制转换不同于转换
强制转换一个对象意味着该对象已经是您要将其强制转换到的对象,并且您只是告诉编译器有关它的信息。例如,如果我有一个Foo
引用,我知道它是一个foosublass
实例,那么(foosublass)Foo
告诉编译器,“不要更改实例,只要知道它实际上是一个foosublass
另一方面,整数
不是字符串
,尽管(正如您所指出的)有一些方法可以获取表示整数的字符串。由于整数的实例不能是字符串,所以不能将整数转换为字符串。为什么不能这样做:
因为字符串和整数不在同一对象层次结构中
Object
/ \
/ \
String Integer
您正在尝试的强制转换只有在它们处于相同的层次结构时才有效,例如
Object
/
/
A
/
/
B
在这种情况下,(A)objB
或(对象)objB
或(对象)objA
将起作用
因此,正如其他人已经提到的,要将整数转换为字符串,请使用:
String.valueOf(integer)
,或原语的integer.toString(integer)
或
对象的Integer.toString()
。如果不需要强制转换,则需要调用toString()
铸造。它是如何工作的
鉴于:
class A {}
class B extends A {}
(A)
|
(B)
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和B2类型不可转换。
编译器100%知道强制转换不可能工作。但您可以欺骗编译器:
B2 b2 = (B2)(A)b1;
但无论如何,在运行时:
线程“main”java.lang.ClassCastException中的异常:B1无法转换为B2
在您的情况下:
(对象)
/\
(整数)(字符串)
运行时:线程“main”java.lang.ClassCastException中的异常:java.lang.Integer不能转换为java.lang.String使用.toString,如下所示:
String myString = myIntegerObject.toString();
正如Petar在上面所说,这应该是String.valueOf(integer)
@UrsReupke:谢谢,事实上,当我试图添加链接时,我重新编写了错误的链接。这会导致不必要的取消装箱操作。@Ted Hopp请参阅我的编辑,以明确何时使用每种类型的toString()
method我认为最后一行应该是String myString=myIntegerObject.toString();
@Ted Hopp-哪一行?如果是原语,请使用前两行,如果是整数对象,请使用第三行。哎呀。我没有看到你答案的最后一句话。我正在删除我的注释并对这个答案进行投票。类似(但不重复)问题:因为“int”不是对象,更不是字符串层次结构中的对象。“每个对象都可以强制转换为字符串”——这是错误的。相反,每个对象都有一个toString()
方法将其转换为字符串。正如一些答案所指出的,这是您应该使用的。(对于某些对象,toString()
不会返回非常有用的字符串,但是对于Integer
,它可能会完全满足您的需要。)“+myIntegerObject
也可以:)在我的情况下,这个错误是错误报告的……我使用的是Integer.toString(IntegerObject)
它给了我这个错误,但它对IntegerObject.toString()很满意
…是的,这确实是一个整数,我确实遇到了这个错误…请注意,只有String.valueOf()
才有效…OP是从一个整数对象开始的。只执行更有效
B1 b1 = new B1();
B2 b2 = (B2)b1; // B1 can't ever be a B2
B2 b2 = (B2)(A)b1;
Integer i = 33;
//String s = (String)i; - compiler error
String s = (String)(Object)i;
String myString = myIntegerObject.toString();