今日は、パッケージの宣言とインポートについての問題に挑戦しましょう。
問題
次のプログラムはコンパイル時にエラーが発生します。その原因を特定してください。
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.util
とjava.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);
}
}