2章8

申し訳ありませんが、誤解を招く説明をしてしまいました。

質問のコードを再度確認すると、var キーワードを使用していますが、これはJava 10以降であれば型推論を使って適切な型が推論される機能です。この機能により、最初に B クラスのインスタンスを作成し、その後で C クラスのインスタンスを作成して a に代入しています。

ただし、var を使用すると、最初に割り当てられた型に基づいて変数の型が推論されます。ですので、var a = new B(); とした場合、aB 型と推論されます。その後に a = new C(); とすると、C のインスタンスを B 型の変数に代入しようとしているため、これは型の不一致であり、コンパイルエラーが発生します。

このため、解答としては「コンパイルエラーが発生する」が正しいです。BC は共に A を継承していますが、互いには関連がないため、B 型の変数に C 型のインスタンスを代入することはできません。

コードにコメントを追加して説明します。

// test() メソッドを持つ基底クラス
public class A { public void test() { System.out.println("A"); }
} // Aを継承し、test() メソッドをオーバーライドしているBクラス
public class B extends A { @Override public void test() { System.out.println("B"); }
} // Aを継承し、test() メソッドをオーバーライドしているCクラス
public class C extends A { @Override public void test() { System.out.println("C"); }
} // プログラムを実行するためのmainメソッドを含むMainクラス
public class Main { public static void main(String[] args) { // 最初にBクラスのインスタンスを作成し、aはB型と推論される var a = new B(); // B型の変数aにCクラスのインスタンスを代入しようとするとコンパイルエラーが発生 a = new C(); // ここでコンパイルエラー // エラーがなければ、aが参照するオブジェクトのtest()メソッドを呼び出す a.test(); }
}
Enter fullscreen mode
Exit fullscreen mode

この説明が明確に理解に繋がることを願っています。


Discover more from Coursity

Subscribe to get the latest posts sent to your email.

Leave a Comment

Your email address will not be published. Required fields are marked *

Discover more from Coursity

Subscribe now to keep reading and get access to the full archive.

Continue reading

Scroll to Top
Martins ad network.