画像のコードには、直接コメントを加えることはできませんが、以下に示すように、各重要な部分にコメントを付けたバージョンのコードを説明します。
// クラスAの定義
public class A {
private int num; // クラスAのprivate変数num
// クラスAのコンストラクタ
public A(int num) {
this.num = num; // 引数の値をインスタンス変数に設定
}
// equalsメソッドのオーバーライド
public boolean equals(Object obj) {
A a = (A) obj; // 引数として渡されたObject型のオブジェクトをA型にキャスト
return this.num == a.num; // キャストしたオブジェクトのnumとこのオブジェクトのnumを比較
}
}
// クラスBの定義
public class B {
private int num; // クラスBのprivate変数num
// クラスBのコンストラクタ
public B(int num) {
this.num = num; // 引数の値をインスタンス変数に設定
}
// equalsメソッドのオーバーライド
public boolean equals(Object obj) {
B b = (B) obj; // 引数として渡されたObject型のオブジェクトをB型にキャスト
return this.num == b.num; // キャストしたオブジェクトのnumとこのオブジェクトのnumを比較
}
}
// メインクラス
public class Main {
public static void main(String[] args) {
A a = new A(10); // クラスAのインスタンスを作成し、numに10を設定
B b = new B(10); // クラスBのインスタンスを作成し、numに10を設定
// クラスAのインスタンスのequalsメソッドを呼び出し、
// クラスBのインスタンスを引数として渡す
System.out.println(a.equals(b));
}
}
このコードでは、Main
クラスのmain
メソッド内で、a.equals(b)
が呼び出された時、クラスAのequals
メソッドがクラスBのインスタンスであるb
をクラスAのインスタンスとしてキャストしようと試みます。しかし、これは異なるクラス型間のキャストであり、実行時にClassCastException
を引き起こします。このため、コードは例外をスローし、プログラムはクラッシュします。
追記
スローされるClassCastException
を回避するには、equals
メソッド内でキャストを行う前に、渡されたオブジェクトが適切な型かどうかを確認する必要があります。この確認はinstanceof
演算子を使用して行うことができます。instanceof
は指定されたオブジェクトが指定されたクラスのインスタンスであるかどうかをチェックし、その結果に基づいてtrue
またはfalse
を返します。
以下は、クラスAとクラスBのequals
メソッドを修正した例です。
クラスA:
public boolean equals(Object obj) {
if (this == obj) return true; // オブジェクトが自分自身であるかチェック
if (obj == null || getClass() != obj.getClass()) return false; // objがnullでなく、正しいクラス型であるかチェック
A a = (A) obj; // 安全なキャスト
return this.num == a.num; // 実際の数値比較
}
クラスB:
public boolean equals(Object obj) {
if (this == obj) return true; // オブジェクトが自分自身であるかチェック
if (obj == null || getClass() != obj.getClass()) return false; // objがnullでなく、正しいクラス型であるかチェック
B b = (B) obj; // 安全なキャスト
return this.num == b.num; // 実際の数値比較
}
getClass()
メソッドを使用しているのは、オブジェクトが正確にそのクラスのインスタンスであることを確認するためです。これにより、サブクラスのインスタンスも拒否されます。instanceof
を使っていた場合、サブクラスのインスタンスも受け入れてしまう可能性があります。
この修正により、異なるクラスのインスタンス間でequals
メソッドが呼び出されたときにClassCastException
が発生することはなくなります。代わりにfalse
が返されるようになります。
Top comments (0)