@tt25mrc

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Java Silver SE17 第6章−15

解決したいこと

以下の問題の解説を読んでも理解ができなかったため、ご教授お願いします。

発生している問題

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クラス型のオブジェクトが渡されるのでしょうか??

0 likes

3Answer

「そのため、Aクラスのequalsメソッドの引数に渡されるのは、互換性のないBクラス型のオブジェクトへの参照です。」は文の繋がりがおかしいですね。Bの参照が引数に渡されるのは a.equals(b) と書いたからであって、「そのため」で受けている前段の内容とは関係ありません。

0Like

なぜ、Aクラスのequalsメソッドの引数にBクラス型のオブジェクトが渡されるのでしょうか??

単純に回答するならば、問題としてそのような状況が設定されている、という回答になりますね。
Mainクラスの処理がそのようになっています。

「そもそも異なるクラスをなぜ比較しようとしているのか」という質問であれば、
例えばAクラスとBクラスをドルクラスと円クラスに置き換えてみれば想像しやすいのではないでしょうか?

Dollar dollar = new Dollar(1);
Yen yen = new Yen(150);
dollar.equals(yen); // 1ドル == 150円 ?
0Like

Your answer might help someone💌