にキャストParent
することはできずChild
、 にのみキャストできると思っていましChild
たParent
。または、少なくともそうした場合、子供の機能にアクセスすることは許可されません。
次に、Java で親を子に明示的にキャストできることがわかります。
a=(B)a;
しかし許さない
bArray[0]=a
または
a.testB();
しかし、これは大丈夫です:
bArray[1]=(B)a;
これもそうです:
bArray[1].testB();
誰かここで何が起こっているのか説明してもらえますか!? 親クラスに子クラスの機能を与えるにはどうすればよいですか? また、配列に a を配置する最初の試みが機能しないのに、2 回目の試行が機能するのはなぜですか? 同じでなくていいの?
class A {
public void testA() {
}
}
class B extends A {
public void testB() {
}
}
public class polymorphicObjects {
public static void main(String[] args) {
B bArray[] = new B[5];
A a = new A();
A ab = new B();
a = (B)a; //didnt think you could do this
bArray[0] = a; //but if I can the why doesnt this work?
a.testB(); //or this
bArray[1] =(B)a; //but this does work
bArray[1].testB(); //and so does this!?
}
}
ランニングはbArray[1].testB();
本当に効果があるの?少なくとも ClassCastException がスローされるはずです。testB() メソッド内に print ステートメントを追加すると、これに役立ちます。
したがって、これでは、a = (B)a;
どちらが a をタイプ B に非常に明示的にキャストしていると言っていますが、実際には何の意味もありません。
これを念頭に置いて、これはbArray[0] = a;
明示的にキャストされていないため、最初の行では機能しません。したがって、コンパイラは一致しない型を指定していると文句を言います。
次の行でbArray[1] = (B)a;
は、a がタイプ B であることをコンパイラーに明示的に伝えているので、メソッド testB() の呼び出しは実行時に失敗するはずですが、それはあなたに吠えません...
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加