DEV Community

TANIAOKA, Akihiro
TANIAOKA, Akihiro

Posted on

7章15

提供されたコードの説明は以下の通りです:

  • public interface A { } はインターフェースAの宣言です。これにより、Aを実装するクラスは、A型として扱うことができます。
  • public class B implements A { }Aを実装するクラスBを定義しています。
  • public class C extends B { }Bを継承するクラスCを定義しています。BAを実装しているため、Cも間接的にAを実装しています。
  • public class D { } は何も継承も実装もしていないただのクラスです。

Mainクラスにおいて、A[] array = { new B(), new C(), new A(), new D() }; の行がありますが、Javaではインターフェースはインスタンス化できないため、new A()は不可能です。これはコンパイルエラーとなります。そして、DAを実装していないため、A型の配列にnew D()を格納することはできません。

ついては、6行目のnew A()と7行目のnew D()がコンパイルエラーになります。したがって、正しい答えはFでした。

追記

public interface A { 
    // これはインターフェースAです。具体的なメソッドは定義されていませんが、
    // このインターフェースを実装するクラスは、Aの型として扱うことができます。
}

public class B implements A {
    // これはインターフェースAを実装するクラスBです。
    // インターフェースAに定義されたメソッド(もしあれば)の実装を提供する必要があります。
}

public class C extends B {
    // これはクラスBを継承するクラスCです。
    // クラスBはインターフェースAを実装しているので、
    // クラスCも間接的にインターフェースAを実装していることになります。
}

public class D { 
    // これはただのクラスDで、インターフェースAもクラスBも継承または実装していません。
}

public class Main {
    public static void main(String[] args) {
        A[] array = { // A型の配列を宣言しています。
            new B(), // OK: クラスBはインターフェースAを実装しているので、A型の配列に入れることができます。
            new C(), // OK: クラスCはクラスBを継承しており、BがAを実装しているため、A型の配列に入れられます。
            // new A(), // エラー: インターフェースはインスタンス化できないため、これはコンパイルエラーになります。
            // new D()  // エラー: クラスDはインターフェースAを実装していないため、A型の配列に入れることはできません。
        };
    }
}
Enter fullscreen mode Exit fullscreen mode

コメントにもあるように、new A(),new D()の部分はそれぞれコンパイルエラーを引き起こします。なぜなら、Javaにおいてインターフェースはインスタンス化することができず、Aインターフェースを実装していないクラスのオブジェクトをAインターフェースの配列に格納することはできないからです。

Top comments (0)