1

Javaの次のクラスについて考えてみます。

interface I{
}
class A implements I{
}

class B extends A {
}

class C extends B{
}
And the following declarations:
A a = new A();
B b = new B();

コードを取得したらa = (B)(I) b;、コンパイルして実行します。そして、なぜ私がインターフェイスとクラスBにキャストする必要があるのか​​、まったく理解できません。私の意見では、問題がなければ機能しa = b;ます。誰かが私にコードをうまく実行させる上記の明示的なキャストのロジックを説明できますか?

しかし、一度I i = (C) a;取得すると、「a」はクラスCのオブジェクトを指さないため、実行時に失敗します。「a」がクラスCのオブジェクトを指す必要があるのはなぜですか?それに加えて、Cクラスにキャストするロジックがわかりません。とにかく、あなたはIインターフェースのリファレンスを持っているでしょう。よろしくお願いします

4

2 に答える 2

2

特定のクラスまたはインターフェースへのオブジェクトのキャストは、キャストされたオブジェクトが実際にこのクラスを拡張するか、このインターフェースを実装する場合にのみ可能です。そうでない場合 (つまり、オブジェクトがクラスまたはインターフェイスのインスタンスでない場合)、ClassCastException が発生します。オブジェクトをクラスにキャストしてもオブジェクトの型は変わらないことに注意してください。それは、それが拡張または実装されている別の型として参照することのみを許可します。

あなたの例を見てみましょう:

a = (B)(I) b;

bこれは最初に、タイプのオブジェクトをキャストしますB。インターフェイスにI。B は A を拡張し、A は I を実装しているため、これは問題ありません。これは、B も I を実装していることを意味します。

次に、同じオブジェクトをもう一度クラスにキャストしますBbのインスタンスなBので、これは機能します。

I i = (C) a;

aこれにより、タイプのオブジェクトAがクラスにキャストされますC。A は C を拡張しないので、これは不可能です。

于 2012-10-12T11:29:20.303 に答える
0

Java での参照型のキャストは、プログラマーの自己チェック表記にすぎません。その型の変数は、オブジェクトへの参照 (ポインター) のみを保持します。キャスト中に参照自体も参照オブジェクトも変更されません。実際、そのようなキャストは何もしません。

自己チェックの必要性は、広い型の変数を狭い型の変数に割り当てるときにのみ必要です。たとえば、スーパークラスからサブクラスへ。ここだけでエラーが発生する可能性があるためです。等しい型の変数またはより狭い型の変数から代入する場合は、いつでも可能であるため、チェックは必要ありません。

于 2012-10-12T11:30:07.507 に答える