-1

Object aThing = new Integer(25);

私の教科書によると、式は(type )(Integer) aThingによって参照されるオブジェクトの型をtypeにキャストします。キャスト操作は、によって参照されるオブジェクトが実際にタイプである場合にのみ成功します。そうでない場合は、投げられますaThingObjectIntegeraThingIntegerClassCastException

太字の文が何を言っているのかわかりません。それについて簡単に説明していただけますか?

「によって参照されるオブジェクト」とは何aThingですか?

4

5 に答える 5

2

あなたが持っていた場合

Object aThing = "foo";

その後、aThing本当にになりますString。その場合、(Integer) aThingをスローしClassCastExceptionます。

于 2012-10-15T18:17:39.657 に答える
0
Object aThing = new Integer(25);

aThing参照がを指しているのでInteger object、したがって、その参照をにキャストできますInteger。参照はオブジェクトintegerを指すことができるためです。Integer

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

しかし、その参照を参照に型キャストしようとすると、文字列はではなく、したがってオブジェクトへの参照を含めることができないため、次のStringようになります。ClassCastExceptionIntegerInteger

// Exception. A String reference cannot point to `Integer` object
String strRef = (String)aThing; 
于 2012-10-15T18:19:30.837 に答える
0

型から別の型へのキャストは、キャスト表記が継承ツリーの一部である場合にのみ有効であることに注意してください。

Object x = (String)"X"「X」は String オブジェクトなので有効です。有効(Object)"X"でも有効 Object y = (Integer) 1です。(オブジェクト)1 は有効です。

ただし、あるタイプをまったく別のタイプにキャストすることはできません。

Object x = (Integer)"X"「X」はタイプではないため、有効ではありませんInteger

注意すべきもう1つのことは、これが機能することです。

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

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

上記はandA a型のオブジェクトとして有効です。できないことはBIInterface

C c = (C) a; 

a は C 型ではなく、取得した ClassCastException をスローします。

によって参照さaThing れるオブジェクトは、初期化したオブジェクトになります。

String s = "Hello World" 

s は、「Hello World」オブジェクトへのポインタ/参照を保持します。

Person person = new Person();

person は、作成されたオブジェクトへの参照を保持します。

于 2012-10-15T18:24:33.257 に答える
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;

このコードは機能します。元のオブジェクトint1は.IntegerObject

于 2012-10-15T18:26:06.347 に答える
0

太字の文が何を言っているのかわかりません。それについて簡単に説明していただけますか?

実行時の Java オブジェクトには、オブジェクトがどのクラスであるかを識別する情報が含まれています。オブジェクトを別の型にキャストしようとすると、JRE は最初に、実際に互換性のあるオブジェクト間でキャストしていることを確認します。太字の文は、一般的な意味でも正確ではありません。また、そのオブジェクトの任意のスーパークラス、またはそのオブジェクトが実装する任意のインターフェイスにキャストしてオブジェクトを作成することもできます。

スーパークラスにキャスト可能であることに関するこの特定の部分は、とにかくIntegerとして格納できる理由です-暗黙的にすべてのクラスのスーパークラスです。ObjectObject

この動作により、次のような正しいステートメントを記述できます。

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

Java のオブジェクトには、オブジェクトの正確な ID を決定する実行時情報が含まれていることに注意してください。オブジェクトへのダウンキャストは、この情報を削除しません。そのため、Java では次のようなことを回避できません。

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

そのステートメントはコンパイルされますが、と互換性がないClassCastExceptionため、実行時に が得られます。IntegerString

「によって参照されるオブジェクト」とは何aThingですか?

行の後:

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

aThingは、値 25 を格納する への参照Integerです。オブジェクト クラスの ID は実行時に維持され、キャスト時に失われないことをもう一度思い出してください。

于 2012-10-15T19:23:25.027 に答える