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

时间:2012-01-23 14:44:09

标签: java string casting integer

我发现了一些奇怪的例外:

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

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

代码是:

String myString = (String) myIntegerObject;

感谢。

11 个答案:

答案 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)

不,IntegerString是不同的类型。要将整数转换为字符串,请使用: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)

使用String.valueOf(integer)

返回整数的字符串表示。

答案 10 :(得分:0)

Use .toString instead like below:

String myString = myIntegerObject.toString();