
✅ アップキャストとダウンキャスト
前回はinstanceofについて解説しました。
前回の記事👇
今回はその前提となる「アップキャストとダウンキャスト」について解説します。
🤔 アップキャストとは
👉 子クラスのオブジェクトを、親クラス型として扱うこと
たとえば
Animal a = new Dog();
実体はdogですが、変数の型はAnimalになっています。
💻 サンプルコード(アップキャスト)
今回も犬のクラス構造を使って解説します。
class Animal {} class Dog extends Animal {} interface Trick {} class TalentDog implements Trick {} public class Main { static Dog getDog() { return new Dog(); } static void showAnimal(Animal animal) {} static Trick getTrickDog() { return new TalentDog(); } static void showTrick(Trick trick) {} public static void main(String[] args) { Animal a1 = new Dog(); // 代入 Animal a2 = getDog(); // 戻り値 showAnimal(new Dog()); // 引数 Trick t1 = new TalentDog(); Trick t2 = getTrickDog(); showTrick(new TalentDog()); } }
このコードでは、
- 代入
- 戻り値
- 引数
の3パターンでアップキャストを確認しています。
👉 アップキャストは 自動で行われるため、安全です。
🤔 ダウンキャストとは
👉 親クラス型の参照を、子クラス型として扱い直すことです。
💻 サンプルコード(ダウンキャスト)
こちらも犬のクラス構造で見てみましょう。
class Animal {} class Dog extends Animal { void bark() { System.out.println("Woof!"); } } class Puppy extends Dog { void play() { System.out.println("Playing!"); } } public class Main { public static void main(String[] args) { Animal animal1 = new Puppy(); // アップキャスト Dog dog = (Dog) animal1; // ダウンキャスト成功 dog.bark(); Animal animal2 = new Dog(); // アップキャスト Puppy puppy = (Puppy) animal2; // ダウンキャスト失敗(ここでClassCastException) puppy.play(); } }
⚖️ 成功例と失敗例
✅ 成功するケース
Animal a = new Puppy(); Dog d = (Dog) a; // OK
👉 実体がPuppy(=Dogの子)なので成功します。
❌ 失敗するケース
Animal a = new Dog(); Puppy p = (Puppy) a; // ClassCastException
👉 実体がDogなので、Puppyとして扱うことはできません。
🐶 図で理解する
クラス関係を図で見ると
クラス関係
Animal └ Dog(実体) └ Puppy(ここにいない)
👉 DogをPuppyとして扱うことはできません
🔍 アップキャストとダウンキャストの違い
| 項目 | アップキャスト | ダウンキャスト |
|---|---|---|
| 方向 | 子 → 親 | 親 → 子 |
| 安全性 | 安全 | 危険 |
| キャスト | 不要 | 必要 |
✍️ まとめ
- アップキャストは安全(自動で行われる)
- ダウンキャストは注意が必要(実体が重要)
- キャストは「型」ではなく「実体」を意識することが大切
📝 最後に
キャストは「変身」ではなく「見方を変えるだけ」です。
だからこそ、実体が何かを常に意識することが重要です。
Java学習中の方の参考になれば幸いです🙌