DEV Community

TANIAOKA, Akihiro
TANIAOKA, Akihiro

Posted on

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

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

Top comments (0)