015 ポリモーフィズム(ダウンキャスト) 011 解答例

public class Main {
    public static void main(String[] args) {
        // インスタンスの実際の型が不明なオブジェクト
        Object unknownObject = getUnknownObject();

        // null チェックを行ってからインスタンスが特定の型であるかを確認してからダウンキャスト
        if (unknownObject != null) {
            if (unknownObject instanceof SpecificType) {
                SpecificType specificInstance = (SpecificType) unknownObject;
                // ダウンキャスト後の処理
                specificInstance.doSomething();
            } else {
                System.out.println("The object is not of the expected type");
            }
        } else {
            System.out.println("The object is null");
        }
    }

    // 仮のメソッド:実際のアプリケーションでは適切な方法でオブジェクトを取得
    private static Object getUnknownObject() {
        // ここでは単に SpecificType クラスの新しいインスタンスを返す例
        return new SpecificType();
        // または null を返すこともあります
        // return null;
    }
}

// 仮のクラス:実際のアプリケーションでは適切な型を使用
class SpecificType {
    void doSomething() {
        System.out.println("Doing something specific");
    }
}

この例では、unknownObject というオブジェクトが特定の型であるかどうかを instanceof 演算子を使用して確認してから、安全にダウンキャストしています。また、null チェックも行い、NullPointerException を回避しています。これにより、プログラムが安全に実行されるようになります。

NullPointerException の回避

NullPointerException(以下、NPE)(別名”ヌルポ”)は、Javaプログラムでよく見られる例外の一つで、特にオブジェクトの参照がnullであるときに発生します。これを回避するためには、適切なnullチェックが必要です。

前述のコード例では、次のようにNPEを回避しています:

// null チェックを行ってからインスタンスが特定の型であるかを確認してからダウンキャスト
if (unknownObject != null) {
    if (unknownObject instanceof SpecificType) {
        SpecificType specificInstance = (SpecificType) unknownObject;
        // ダウンキャスト後の処理
        specificInstance.doSomething();
    } else {
        System.out.println("The object is not of the expected type");
    }
} else {
    System.out.println("The object is null");
}

この部分がnullチェックのコードです:

if (unknownObject != null) {
    // ...
} else {
    System.out.println("The object is null");
}

この部分は、unknownObject がnullでない場合に、その後のコードを実行するようにしています。nullである場合には、The object is null と表示しています。このようなチェックを行うことで、unknownObject がnullである場合にNPEを回避できます。

NPEはプログラムの実行時に発生する例外であり、オブジェクトがnullである状態でメソッドやフィールドにアクセスしようとすると発生します。そのため、オブジェクトがnullでないことを確認してから操作を行うことが、NPEを回避する重要な手法です。

「015 ポリモーフィズム」問題集リスト