为什么不能在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()
为对象。
不, Integer
和String
是不同的types。 若要将整数转换为string,请使用: String.valueOf(integer)
,或对于基元的Integer.toString(integer)
,或对于该对象的Integer.toString()
。
对于int
types使用:
int myInteger = 1; String myString = Integer.toString(myInteger);
对于Integer
types使用:
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
,虽然(如你所指出的)有获取代表一个Integer
的String
方法。 由于没有任何Integer
实例可以是一个String
,所以不能将Integer
为String
。
在你的情况下不需要强制转换,你需要调用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();