0

私は以下を得ました:

class A{  
    int foo;  
}  
class B extends A{  
    public void bar();  
}

A のインスタンスを取得し、変数 foo への参照を失わずに B のインスタンスに変換したいと考えています。

例えば:

A a = new A();  
a.foo = 2;  
B b = a; <-- what I want to do.  
//use b  
b.foo = 3;  
//a.foo should now be 3

助けてくれてありがとう!

4

3 に答える 3

4

Java はこれをサポートしていません。ポリモーフィズムを利用して as のインスタンスとBasのインスタンスを処理できますAが、その逆はできません。

これを行うことができない理由は、Aのインスタンスが実際にのインスタンスであることを保証するタイプ セーフな方法がないためですB(インスタンスをキャストすることはできますが、実行時に例外を保証するだけです)。 .

タイプ セーフでポリモーフィックな関係がタイプ間に存在するかどうかを確認する最善の方法は、このステートメントの有効性をテストすることです。

あるタイプのインスタンスは、他のタイプのインスタンスです。

例えば:

Dog のインスタンスはすべて Mammal のインスタンスです。
Mammal のインスタンスはすべて Dog のインスタンスです。

最初の例は真ですが、2 番目の例は偽であることに注意してください。あなたのコード例でやろうとしていることは、哺乳類を犬として扱おうとするのとまったく同じです.たとえそれが時々真実かもしれませんが、それはコンパイラがそれを許可しないことを意味します.

繰り返しになりますが、真である可能性がある場合は、参照をキャストする必要がありますが、これにより、実行時に例外が発生する可能性があります。上記の具体的な例は、 type のインスタンスをインスタンス化したことが明確にわかるため、例外が発生する場合の 1 つですA

于 2010-04-09T13:59:51.770 に答える
0

a変数の実行時型はとにかくAではなくになるため、単純に行うことはできませんB

これは、 ..aの特性がBなく、キャストで取得できないことを意味します。

于 2010-04-09T14:05:56.147 に答える
0

コピー コンストラクターを使用します。

class B extends A{  
    public B(A a){
        this.foo = a.foo;
    }
}
于 2010-04-09T14:02:29.063 に答える