MENU

【Java Silver】パッケージの宣言とインポートに関する理解

今日は、パッケージの宣言とインポートについての問題に挑戦しましょう。

問題

次のプログラムはコンパイル時にエラーが発生します。その原因を特定してください。

package com.example;

            import java.util.Date;
            import java.sql.Date;

            public class DatePrinter {
                public static void main(String[] args) {
                    Date date = new Date();
                    System.out.println("Today's date: " + date);
                }
            }

選択肢

  • A. 同じパッケージ内に同名のクラスが存在する
  • B. Dateの完全修飾名が指定されていないため、曖昧なインポートになっている
  • C. Dateクラスが非公開であるため
  • D. package宣言の後にコードがないため

答えと解説

回答を見る

答え

B. Dateの完全修飾名が指定されていないため、曖昧なインポートになっている

解説

このプログラムでは、import java.util.Date;import java.sql.Date;の両方がインポートされています。

基本説明:

Javaには同名のクラスが異なるパッケージに存在することが多々あります。

この場合、プログラムはどのクラスを使用すべきかを識別できず、「曖昧さ」というエラーが発生します。

誤答理由:

Aの選択肢は、完全に異なるケースの話で、今回問題になっているのはパッケージ間での同名クラスです。

CやDは関連のない選択肢です。

Bが問題の核心を突いています。

つまずきポイント:

Javaのプログラムでは1つのファイルで同じ名前のクラスを複数インポートすることは問題になります。

これを避けるには、どちらかのDateクラスには完全修飾名を使用するようにします。

例えば、使用したいクラスにjava.util.Dateのように完全修飾名を付けます。

発展知識:

このような状況に陥るのを防ぐためには、従って完全修飾名はとても重要です。

競合するクラス名がある場合、java.utiljava.sqlの英単語“Date”のようにありますが、これは時折役に立つことがあります。

Javaが提供するAPIには他にも同名クラスが多数存在しますので、注意が必要です。

修正例

package com.example;

            import java.util.Date;

            public class DatePrinter {
                public static void main(String[] args) {
                    Date date = new Date();
                    System.out.println("Today's date: " + date);
                }
            }
目次