为什么不能在java中将Integer转换为String?

我发现了一些奇怪的异常:

java.lang.ClassCastException: java.lang.Integer 
 cannot be cast to java.lang.String

怎么可能? 每个对象都可以转换为String,不是吗?

代码是:

String myString = (String) myIntegerObject;

谢谢。

user710818 asked 2019-09-09T14:34:55Z
11个解决方案
141 votes

为什么这是不可能的:

因为String和Integer不在同一个Object层次结构中。

      Object
     /      \
    /        \
String     Integer

您正在尝试的转换只有在它们位于同一层次结构中时才有效,例如

      Object
     /
    /
   A
  /
 /
B

在这种情况下,Integer.toString()Integer.toString(integer)(Object) objA将起作用。

因此,正如其他人已经提到的,要将整数转换为字符串使用:

Integer.toString(),或Integer.toString(integer)原始,

要么

Integer.toString()为该对象。

Bhushan answered 2019-09-09T14:36:10Z
45 votes

不,IntegerString是不同类型。 要将整数转换为字符串,请使用:String.valueOf(integer),或Integer.toString(integer)(对于基元)或Integer.toString()(对象)。

Petar Minchev answered 2019-09-09T14:36:43Z
20 votes

对于Integer类型使用:

int myInteger = 1;
String myString = Integer.toString(myInteger);

对于Integer类型使用:

Integer myIntegerObject = new Integer(1);
String myString = myIntegerObject.toString();
DRiFTy answered 2019-09-09T14:37:22Z
6 votes

不可以。每个对象都可以转换为java.lang.Object,而不是String.如果需要任何对象的字符串表示,则必须调用toString()方法; 这与将对象转换为String不同。

andri answered 2019-09-09T14:37:54Z
5 votes

您不能明确地将任何内容强制转换为int,而不是Integer.您应该使用以下任一项:

"" + myInt;

要么:

Integer.toString(myInt);

要么:

String.valueOf(myInt);

我更喜欢第二种形式,但我认为这是个人选择。

编辑确定,这就是为什么我更喜欢第二种形式。 第一种形式,在编译时,可以实例化int(在Java 1.4中)或Integer在1.5中; 还有一件事要收集垃圾。 据我所知,编译器没有对此进行优化。 第二种形式也有一个模拟,Integer,它允许你指定你是否想要十六进制,八进制等。如果你想在你的代码中保持一致(纯粹在美学上,我猜)第二种形式可以在更多的地方使用。

编辑2我认为你的意思是你的整数是int而不是Integer.如果它已经是Integer,只需使用toString()即可完成。

Jonathan answered 2019-09-09T14:39:00Z
4 votes

如果需要字符串表示,则应调用myIntegerObject.toString()。

Savino Sguera answered 2019-09-09T14:39:33Z
4 votes

可以使用toString()方法将对象转换为字符串:

String myString = myIntegerObject.toString();

关于铸造没有这样的规则。 为了进行转换,对象实际上必须是您要转换的类型。

millimoose answered 2019-09-09T14:40:22Z
2 votes

转换与使用Java转换不同,使用非正式术语。

转换对象意味着对象已经是你所投射的对象,而你只是告诉编译器它。 例如,如果我有一个Integer引用,我知道它是String实例,那么String告诉编译器,“不要更改实例,只知道它实际上是Integer

另一方面,Integer不是String,虽然(如你所指出的)有一些方法可以获得String代表Integer.由于没有Integer的实例可以是String,你不能将Integer转换为IntegerString

yshavit answered 2019-09-09T14:41:09Z
1 votes

在你的情况下不需要强制转换,你需要调用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

Dmitry Sokolyuk answered 2019-09-09T14:44:11Z
0 votes

使用String.valueOf(整数)。

它返回一个整数的字符串表示。

RanRag answered 2019-09-09T14:44:51Z
0 votes

使用.toString,如下所示:

String myString = myIntegerObject.toString();
A.Aleem11 answered 2019-09-09T14:45:23Z
translate from https://stackoverflow.com:/questions/8973381/why-cannot-cast-integer-to-string-in-java