MENU

【Java Silver】インターフェースとローカル変数型推論の理解

今日の問題に挑戦して、知識を深めましょう。

問題

以下のコードを実行したときに正しく出力される選択肢を選びなさい。

interface Creature {
                void speak();
            }

            class Bird implements Creature {
                public void speak() {
                    System.out.println("Chirp");
                }
            }

            public class Main {
                public static void main(String[] args) {
                    var myPet = new Bird();
                    myPet.speak();
                }
            }

選択肢

  • A. Chirp
  • B. コンパイルエラー
  • C. 実行時エラー
  • D. インターフェース型のメソッドが存在しないためエラー

答えと解説

回答を見る

答え

A. Chirp

解説

基本説明:

varキーワードはJava 10から導入されたもので、コンパイラに変数の型を推論させることができます。

このコードでは、var myPet = new Bird();と宣言することで、コンパイラはmyPetの型をBirdとして推論します。

コンストラクタで指定されている型をもとに、Javaのコンパイラが自動的に型を決めてくれるのです。

誤答理由:

誤ってコンパイルエラーや実行時エラーと考えてしまうポイントは、varに対する理解が不十分な場合に起こります。

Javaは型安全な言語で、varでも型安全性が保証されています。

そのため、もともとBird型であるmyPetは、全く問題なくspeakメソッドを呼び出せます。

つまずきポイント:

初心者が躓く箇所としては、ローカル変数型推論を使った際に、実装されているメソッドが確実に呼ばれるか理解に自信を持てない点です。

interfaceは契約のようなもので、実際の機能は実装側のクラスに委ねられます。

Birdクラスが正しくspeakメソッドを実装しているので、インスタンスメソッドが問題なく動作するわけです。

発展知識:

varはローカル変数にのみ使用できます。

ファイル全体に影響を与えるフィールドやinterfaceのメンバーに対しては不適用です。

さらに、varは一度に宣言し、初期化をしなければならないという制約があります。

これは、コンパイラが静的にその型を確定するために必要なためであります。

目次