4

私の質問はJava言語に関連しています。これは私が得たものです:

interface I1{}
interface I2{}
class C1 implements I1{}
class C3 extends C1 implements I2{}

いつ

     C1 01;
     C3 o3;
     I1 i1;

そして今、それI2 i2 = (I2) i1;は正しいことがわかりました。実行時にi1が実際にI2を実装するオブジェクトを参照しているからです。しかし、私にはわかりません。インターフェイスは相互に関係がないので、どのようにして隣接するインターフェイスにキャストできますか?これ以上のコードはありません。Java認定の準備をするための単なるドリルです。よろしくお願いします

4

4 に答える 4

4

をにキャストするIntegerString、コンパイラはそれを不正として停止できますが、クラスはさまざまなインターフェイスを実装できるため、あるインターフェイスタイプを別のインターフェイスタイプにキャストしたときに、違反しているかどうかをコンパイラは認識できません。このコードを考えてみましょう:

I1 i1 = getI1();
if (i1 instanceof I2) {
  I2 i2 = (I2) i1;
}

Javaコンパイラーが、あるインターフェースから別のインターフェースへのキャストを許可しなかった場合、この完全に正当なコードはコンパイルされません。

于 2012-11-04T14:09:39.613 に答える
2

I2 i2 = (I2) i1;i1意味:によって参照されるオブジェクトの具体的な実行時型がインターフェイスを実装していることを知っているI2ので、それをとして参照したいと思いますI2。の具体的なランタイムタイプがi1実際に実装されているI2場合、キャストは成功します。

I1と共通点がないという事実I2は重要ではありません。重要なのは、によって参照されるオブジェクトの実際の具体的な実行時型ですi1

于 2012-11-04T14:01:40.347 に答える
1

You answered the question yourself ;-)

"[... ]is right because at run time i1 actually refers to an object that implements I2"

Typecasts are evaluated at runtime and not at compiletime. So if the object that i1 points to at runtime is of type I2 there are no errors.

于 2012-11-04T14:03:09.693 に答える
1

簡単に言うと、インターフェースは鳥のようなタイプであり、ワシやアヒルではありません。これらのクラスの具体的な実装を取ります(これはかなりばかげていますが、私には耐えてください)

interface Bird {fly();}
interface Swimmer {swim();}
class Eagle implements Bird {fly(){...};}
class Duck extends Eagle implements Swimmer {swim(){...};}

Swimmer i2 = (Swimmer) i1;

これは、コードがi1が泳ぐことができるエンティティであると信じていることを意味します。i1がアヒルの場合、このコードは機能します。ワシの場合、これは失敗します。型キャストは、コンパイル時ではなく実行時に行われます。

于 2012-11-04T14:09:15.633 に答える