アップキャスト・ダウンキャストとinstanceof
親型へのアップキャスト、instanceofを使った安全なダウンキャスト、ClassCastExceptionにつながるよくある落とし穴を理解します。
「アップキャスト・ダウンキャストとinstanceof」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン3/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全3レッスンが含まれています。
アップキャストとダウンキャスト
アップキャストは子オブジェクトを親型の参照に格納することで、常に安全です。ダウンキャストはその逆で、注意が必要です。実行時に実際の型を確認するにはinstanceofを使います。
コード: アップキャストの例
アップキャストは暗黙的に行われ、安全です。DogをAnimalとして扱えます。Animalで宣言されたメソッドを呼び出せ、実行時にはDogのバージョンが実行されます。
public class Main {
static class Animal {
void speak() { System.out.println("Animal sound"); }
}
static class Dog extends Animal {
void speak() { System.out.println("Woof"); }
void fetch() { System.out.println("Fetch!"); }
}
public static void main(String[] args) {
// Upcasting: Dog stored in an Animal reference (safe, automatic)
Animal a = new Dog();
a.speak(); // calls Dog's speak() due to dynamic binding
// a.fetch(); // Not allowed: reference is Animal, which does not declare fetch
System.out.println("Upcasting hides Dog-only methods from the reference type.");
}
}
なぜダウンキャストするのですか
fetch()のような子クラス固有のメソッドが必要なときにダウンキャストします。ただし、これは慎重に確認したうえで、必要最小限に行うべきです。可能な場合は、親クラスやインターフェースを基準にコードを書くことを優先してください。
コード: 安全なダウンキャスト
キャストする前にinstanceofを使います。確認に失敗した場合はキャストを行わず、別の処理を選びます。これによりClassCastExceptionを防げます。
public class Main {
static class Animal { void speak() { System.out.println("Animal sound"); } }
static class Dog extends Animal { void speak() { System.out.println("Woof"); } void fetch() { System.out.println("Fetch!"); } }
static class Cat extends Animal { void speak() { System.out.println("Meow"); } }
public static void main(String[] args) {
Animal a1 = new Dog();
Animal a2 = new Cat();
// Safe downcast using instanceof
if (a1 instanceof Dog) {
Dog d = (Dog) a1;
d.fetch(); // OK
}
if (a2 instanceof Dog) {
Dog d2 = (Dog) a2; // will not run
d2.fetch();
} else {
System.out.println("a2 is not a Dog, skip casting.");
}
}
}
よくある落とし穴
落とし穴: 確認せずにキャストすると、ClassCastExceptionが発生する可能性があります。インターフェースを中心に設計せず、ダウンキャストを多用することも問題です。キャストは必要な場所の近くに置き、ポリモーフィズムを優先してください。
コード: 不適切なキャストと安全なキャスト
決めつけてキャストしてはいけません。実行時の型が確かでない場合は、instanceofでキャストを保護し、一致しなければ安全な代替処理を選んでください。
public class Main {
static class Animal { void speak() { System.out.println("Animal"); } }
static class Dog extends Animal { void fetch() { System.out.println("Fetch!"); } }
static class Cat extends Animal { }
public static void main(String[] args) {
Animal a = new Cat();
// Bad: direct cast (would throw at runtime)
// Dog dBad = (Dog) a; // ClassCastException if uncommented
// Good: check first
if (a instanceof Dog) {
Dog d = (Dog) a;
d.fetch();
} else {
System.out.println("Not a Dog; skipping cast.");
}
}
}
ダウンキャストの確認
簡単な確認: Animal型の参照を安全にDogへダウンキャストするには、どうすればよいですか?
復習
復習: アップキャストは安全で、頻繁に使われます。ダウンキャストでは、クラッシュを避けるためにinstanceofが必要です。キャストを減らすため、親型やインターフェースを基準に設計してください。
よくある質問
「アップキャスト・ダウンキャストとinstanceof」レッスンは無料ですか?
はい。「アップキャスト・ダウンキャストとinstanceof」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全3レッスンが含まれています。
「アップキャスト・ダウンキャストとinstanceof」で何を学びますか?
親型へのアップキャスト、instanceofを使った安全なダウンキャスト、ClassCastExceptionにつながるよくある落とし穴を理解します。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Java Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/3です。
「アップキャスト・ダウンキャストとinstanceof」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このJava Academyレッスンでコードを書いて実行できますか?
はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 抽象クラス
- インターフェース(入門と比較)
- アップキャスト・ダウンキャストとinstanceof