Javaで異なるオブジェクトをキャストする方法


  1. インプリシットキャスト(暗黙的なキャスト): サブクラスのオブジェクトをスーパークラスの型に代入する場合、Javaは自動的にキャストを行います。例えば、以下のようなクラスがあるとします:

    class Animal {
       // Animalのコード
    }
    class Dog extends Animal {
       // Dogのコード
    }

    この場合、DogクラスのインスタンスをAnimalクラスの参照変数に代入することができます:

    Dog dog = new Dog();
    Animal animal = dog; // インプリシットキャスト

    これは可能な理由は、DogクラスがAnimalクラスを継承しているためです。

  2. エキスプリシットキャスト(明示的なキャスト): サブクラスのオブジェクトをスーパークラスの型に代入する場合、明示的なキャストが必要です。以下の例をご覧ください:

    Animal animal = new Animal();
    Dog dog = (Dog) animal; // エキスプリシットキャスト

    この場合、AnimalクラスのインスタンスをDogクラスの参照変数に代入しています。ただし、注意点として、実際のオブジェクトがDogのインスタンスでない場合、実行時にClassCastExceptionがスローされる可能性があるため、キャストを行う前にインスタンスの型を確認する必要があります。

  3. インターフェースのキャスト: インターフェースを実装したクラスのオブジェクトをインターフェース型にキャストすることもできます。以下の例をご覧ください:

    この場合、DocumentクラスのインスタンスをPrintableインターフェース型にキャストすることができます:

    Document document = new Document();
    Printable printable = (Printable) document; // インターフェースのキャスト

    インターフェースのキャストもエキスプリシットキャストと同様に、実際のオブジェクトがインターフェースを実装していない場合にClassCastExceptionがスローされる可能性があるため、注意が必要です。

これらはJavaで異なるオブジェクトをキャストするための一般的な方法です。ただし、適切なキャストを行う前にオブジェクトの型を確認することは重要です。また、実行時に発生する可能性のあるClassCastExceptionを避けるために、キャストを行う前にインスタンスの型を確認することもお勧めします。