DEV Community

TANIAOKA, Akihiro
TANIAOKA, Akihiro

Posted on

10章15

画像のコードには、直接コメントを加えることはできませんが、以下に示すように、各重要な部分にコメントを付けたバージョンのコードを説明します。

// クラス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));
    }
}
Enter fullscreen mode Exit fullscreen mode

このコードでは、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; // 実際の数値比較
}
Enter fullscreen mode Exit fullscreen mode

クラス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; // 実際の数値比較
}
Enter fullscreen mode Exit fullscreen mode

getClass()メソッドを使用しているのは、オブジェクトが正確にそのクラスのインスタンスであることを確認するためです。これにより、サブクラスのインスタンスも拒否されます。instanceofを使っていた場合、サブクラスのインスタンスも受け入れてしまう可能性があります。

この修正により、異なるクラスのインスタンス間でequalsメソッドが呼び出されたときにClassCastExceptionが発生することはなくなります。代わりにfalseが返されるようになります。

Top comments (0)