Java Silver SE17 第6章−15
Q&A
Closed
解決したいこと
以下の問題の解説を読んでも理解ができなかったため、ご教授お願いします。
発生している問題
1. public class A {
2. private int num;
3. public A(int num) {
4. this. num = num;
5. }
6. public boolean equals (Object obj){
7. A a = (A) obj;
8. return this.num == a. num;
9. }
10. }
1. public class B {
2. private int num;
3. public B(int num) {
4. this.num = num;
5. }
6. public boolean equals (Object obj) &
7. B b = (B) obj;
8. return this.num == b.num;
9. }
10. }
これらのクラスを利用する以下のプログラムを、コンパイル、実行した時の結果として、正しいものを選びなさい。
1. public class Main {
2. public static void main(String[] args) {
3. A a = new A(10);
4. B b = new B(10);
5. System.out.println(a.equals(b));
6. }
7. }
A.trueが表示される
B.falseが表示される
C.コンパイルエラーが発生する
D.実行時に例外がスローされる
答え:D
【解説】
継承関係や実現関係にないクラスにキャストしようとすると、ClassCastExceptionが発生します。
設問のコードでは、AクラスとBクラスの間には、継承関係も実現関係もありません。AクラスとBクラスがオーバーライドしているequalsメソッドはobectクラスに定義されているメソッドで、Object型の引数を受け取ります。
そのため、引数で受け取る側の型と同じ型にダウンキャストして比較するという処理でオーバーライドするのが一般的です。
equalsメソッドをオーバーライドする場合、本来はダウンキャストするタイミングで、instanceof演算子を使って型に互換性がなかった場合のことを想定してプログラミングするべきです。しかし、設問のコードでは引数で受け取ったオブジェクトをすぐにダウンキャストしています。
そのため、Aクラスのequalsメソッドの引数に渡されるのは、互換性のないBクラス型のオブジェクトへの参照です。
→ここの、「そのため〜」の文章が分からなく、なぜ、Aクラスのequalsメソッドの引数にBクラス型のオブジェクトが渡されるのでしょうか??