AI作成・AIで再検証済(有資格者監修なし)1Z0-815-JPN 対応
import(ワイルドカードインポートと型名の曖昧性)難易度 高無料

次のコードのコンパイル結果として正しいものを選べ。

1  import java.util.*;
2  import java.sql.*;
3  public class Q4 {
4      public static void main(String[] args) {
5          Date d = new Date();
6          System.out.println(d);
7      }
8  }
  1. Aコンパイルエラー(Date の参照が java.util.Date と java.sql.Date のどちらか曖昧)
  2. Bコンパイル成功。後に書かれた import java.sql.*; が優先され java.sql.Date として解決される
  3. Cコンパイル成功。java.lang と同じパッケージが優先され java.util.Date として解決される
  4. Dコンパイルエラー(java.util と java.sql を同時にインポートすること自体が禁止されている)
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・AIで再検証済

解説

ワイルドカードインポート(import パッケージ.*;)は、そのパッケージ配下の全ての型を「使用可能な候補」として取り込むだけで、 実際にどの型を指すかはコード中で使われた時点で解決される。

java.util と java.sql の両方に Date という同名クラスが存在する。 両方をワイルドカードインポートした状態で単に Date と書くと、コンパイラはどちらの Date か一意に決定できず、曖昧な参照としてコンパイルエラーになる。

解消するには java.util.Date d = new java.util.Date(); のように完全修飾名で指定するか、片方だけを単一型インポート(import java.util.Date;)にする。

各誤答が違う理由
  • Bワイルドカードインポートに「後勝ち」の優先順位は無い。同名クラスが複数パッケージに存在する場合はコンパイラが一意に決定できずコンパイルエラーになる。
  • Cjava.util・java.sql のどちらも java.lang ではなく暗黙インポートの対象外。両者は対等な候補として扱われ、優先順位による自動解決は行われない。
  • D異なるパッケージを同時にインポートすること自体は合法。問題となるのは、それらの中に同名の型が実在し、かつコード中で曖昧に参照されたことである。
ひっかけ: 「ワイルドカードインポートは名前解決の手間を省くだけで安全」という思い込みが罠。同名クラスが複数パッケージに存在する場合はワイルドカード同士が衝突し、コンパイルエラーになる。単一型インポート(import java.util.Date;)同士で衝突する場合はそもそも記述時点でエラーになる点との違いにも注意(ワイルドカードは"使用時"に判明する)。
コマンド例と想定される挙動(未実行)
javac でコンパイル:
Q4.java:5: error: reference to Date is ambiguous
        Date d = new Date();
        ^
  both class java.util.Date in java.util and class java.sql.Date in java.sql match
→ コンパイル不成立(実行に至らない)。
AIが作成し、別の手順のAIで誤りを点検した解説です(有資格者による監修は経ていません)

この問題集の作り方

  1. 問題と解説はAIが作成しています。この資格の問題に、有資格者(著者)の監修は入っていません。
  2. 各問に、公式ドキュメントの出典リンクを付けています。書いてあることは、出典に当たって確かめられます。
  3. 誤答の選択肢それぞれに、なぜ誤りなのかの理由を書いています。
  4. 誤りを見つけたら報告できます。原則として無償で訂正・削除します。
  5. 各試験の運営団体とは無関係の非公式教材です。合格を保証するものではありません。
この分野をもっと解いて、得点源に
Java基礎 を含む問題を分野別に演習できます。
演習する →