为什么不能在Integer中inputstring?

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

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

怎么可能? 每个对象都可以被转换成string,不是吗?

代码是:

 String myString = (String) myIntegerObject; 

谢谢。

为什么这是不可能的:

因为string和整数不在同一个对象层次结构中。

  Object / \ / \ String Integer 

你正在尝试的演员,只有在他们处于相同的层次结构中才有效

  Object / / A / / B 

在这种情况下, (A) objB(Object) objB(Object) objA将起作用。

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

String.valueOf(integer) ,或者Integer.toString(integer)

要么

Integer.toString()为对象。

不, IntegerString是不同的types。 若要将整数转换为string,请使用: String.valueOf(integer) ,或对于基元的Integer.toString(integer) ,或对于该对象的Integer.toString()

对于inttypes使用:

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

对于Integertypes使用:

 Integer myIntegerObject = new Integer(1); String myString = myIntegerObject.toString(); 

不。每个对象都可以被转换成一个java.lang.Object ,而不是一个String 。 如果你想要任何对象的string表示,你必须调用toString()方法。 这不同于将对象转换为string。

您不能将任何明确的任何内容强制转换为不是String 。 你应该使用:

 "" + myInt; 

要么:

 Integer.toString(myInt); 

要么:

 String.valueOf(myInt); 

我更喜欢第二种forms,但我认为这是个人select。

编辑好,这是为什么我喜欢第二种forms。 第一种forms在编译时可以在1.5中实例化一个StringBuffer (在Java 1.4中)或一个StringBuilder 。 还有一件事是垃圾收集。 据我所知,编译器并没有对此进行优化。 第二种forms也有一个类似的, Integer.toString(myInt, radix) ,可以让你指定是否要hex,八进制等。如果你想在你的代码是一致的(纯粹美学,我猜)第二种forms可以在更多的地方使用。

编辑2我假设你的意思是你的整数是一个int而不是一个Integer 。 如果它已经是一个Integer ,只需使用toString()就可以完成了。

如果你想要string表示,你应该调用myIntegerObject.toString()。

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

 String myString = myIntegerObject.toString(); 

关于铸造没有这样的规则。 为了铸造工作,该对象必须是您正在铸造的types。

铸造不同于在Java中转换,使用非正式的术语。

抛出一个对象意味着对象已经是你要抛出的对象,而你只是告诉编译器。 例如,如果我有一个Foo引用,我知道它是一个FooSubclass实例,那么(FooSubclass)Foo告诉编译器:“不要更改实例,只要知道它实际上是一个FooSubclass

另一方面,一个Integer 不是一个String ,虽然(如你所指出的)有获取代表一个IntegerString方法。 由于没有任何Integer实例可以是一个String ,所以不能将IntegerString

在你的情况下不需要强制转换,你需要调用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在同一个inheritance树中,我们可以这样做:

 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 

错误:不可转换typesB1和B2。 编译器100%知道演员不可能工作。 但是你可以欺骗编译器:

 B2 b2 = (B2)(A)b1; 

但无论如何在运行时:

线程“main”java.lang.ClassCastException中的exception:B1不能转换为B2

在你的情况下:

(目的)
/ \
(整数)(string)

 Integer i = 33; //String s = (String)i; - compiler error String s = (String)(Object)i; 

运行时:线程“main”中的exceptionjava.lang.ClassCastException:java.lang.Integer不能转换为java.lang.String

使用String.valueOf(整数) 。

它返回整数的string表示forms。

使用.toString而不是像下面这样:

 String myString = myIntegerObject.toString();