Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在java中不能将整数转换为字符串?_Java_String_Casting_Integer - Fatal编程技术网

为什么在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();