在类层次结构中强制转换

时间:2012-10-15 18:16:22

标签: java

Object aThing = new Integer(25);

根据我的教科书,表达式(Integer) aThingaThing引用的对象的类型(类型Object)转换为Integer类型。 仅当aThing引用的对象实际上是类型Integer 时,转换操作才会成功;如果没有,将会发现ClassCastException

我不明白粗体句子在说什么。你能简单地详细说明一下吗?

什么是“aThing引用的对象”?

5 个答案:

答案 0 :(得分:2)

如果你有

Object aThing = "foo";

然后aThing真的是String。在这种情况下,(Integer) aThing会抛出ClassCastException

答案 1 :(得分:0)

Object aThing = new Integer(25);

现在,aThing引用指向Integer object。因此,您可以将该引用强制转换为Integer。因为integer引用可以指向Integer对象。

Integer intRef = (Integer)aThing; // Ok, `aThing` points to an Integer object

但是当你试图对那个String引用的引用进行类型转换时,你会得到ClassCastException,因为String不是Integer,因此不能包含对Integer的引用// Exception. A String reference cannot point to `Integer` object String strRef = (String)aThing; 对象。

{{1}}

答案 2 :(得分:0)

请注意,从类型转换为另一个类型仅在强制转换符号位于继承树的一部分时才有效。

所以Object x = (String)"X"有效,因为“X”是一个String对象(Object)"X"也是有效的 Object y = (Integer) 1有效。 (对象)1有效。

然而,你不能做的是将一种类型转换为完全不同的类型。

Object x = (Integer)"X"它无效,因为“X”不属于Integer类型;

另外需要注意的是,这将有效。

class A extends B implements IInterface.
class C implements IInterface
A a = new A() ;

B b = (B)a; 
IInterface c = (IInterface)a ;

以上内容有效,因为A aBIInterface类型的对象。 你不能做的是

C c = (C) a; 

a不是C类型,会抛出你得到的ClassCastException。

aThing引用的对象将是您初始化它的对象。

String s = "Hello World" 

拥有指向“Hello World”对象的指针/引用。

Person person = new Person();

person拥有对创建对象的引用。

答案 3 :(得分:0)

考虑以下代码:

FooClass foo = new FooClass();
Object aThing = foo;
Integer anInt = (Integer) aThing;

此代码会抛出ClassCastException,因为原始对象foo不是Integer对象。现在考虑这段代码:

Integer int1 = new Integer(1);
Object aThing = int1;
Integer int2 = (Integer) aThing;

此代码可以使用,因为原始对象int1Integer,因此如果将其存储为更通用的类型,例如Object,则可以将其转换回原班。

答案 4 :(得分:0)

  

我不明白粗体句子在说什么。你能简单地详细说明一下吗?

运行时的Java对象包含标识对象所在类的信息。当您尝试将对象转换为其他类型时,JRE将首先验证您是否在兼容对象之间进行转换。粗俗的句子在一般意义上也不完全正确;它还允许您转换和反对该对象的任何超类,或者该对象实现的任何接口。

关于可以转换为超类的这个特殊部分是你无论如何都可以将Integer存储为Object的原因 - Object隐含地是所有类的超类。

这就是为什么你可以编写一个正确的语句,如:

Object aThing = new Integer(25); // cast Integer to superclass (Object)

请记住,java中的对象包含确定对象的确切标识的运行时信息。向下转换为对象不会删除此信息,这就是为什么java不会让您逃脱以下内容:

Object aThing = new Integer(25); // cast Integer to superclass (Object)
String something = (String) aThing; // cast Integer (stored as object) to String

该语句将编译,但由于ClassCastExceptionInteger不兼容,因此您将在运行时获得String

  

什么是“aThing引用的对象”?

行后:

Object aThing = new Integer(25); // cast Integer to superclass (Object)

aThing是对存储值25的Integer的引用。再次记住,对象类标识在运行时维护,并且在转换时不会丢失。