AI作成・AIで再検証済(有資格者監修なし)1Z0-815-JPN 対応
メソッド(オーバーロード解決=最小の暗黙拡大変換が優先)難易度 高無料

次のコードの出力として正しいものを選べ。

1  public class Q8 {
2      static void f(long x)   { System.out.println("long"); }
3      static void f(double x) { System.out.println("double"); }
4      static void f(int x)    { System.out.println("int"); }
5      public static void main(String[] args) {
6          byte b = 5;
7          f(b);
8      }
9  }
  1. Aint
  2. Blong
  3. Cdouble
  4. Dコンパイルエラー(f(byte) が複数の候補と曖昧になる)
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・AIで再検証済

解説

byte 型の実引数に対して f(int)・f(long)・f(double) のいずれも暗黙の拡大変換(widening)で呼び出し可能であり、複数のオーバーロードが候補になる。

このように複数の候補がある場合、コンパイラは最も小さい(変換段階の少ない)拡大変換で到達できるオーバーロードを優先する。 プリミティブの拡大変換の順序は byte → short → int → long → float → double。

byte から最も近い(変換1段階)候補は int であり、long・double はさらに遠い(変換段階が多い)。 よってコンパイラは f(int) を選択し、出力は int になる。

各誤答が違う理由
  • Bbyte から int への変換の方が long への変換より段階が少なく近い。より近い f(int) が優先される。
  • Cdouble は byte→short→int→long→float→double の中で最も遠い変換。他に近い候補(int)がある限り選ばれない。
  • D拡大変換で到達できる候補が複数あっても、最も近い変換のオーバーロードが一意に決まるため曖昧エラーにはならない。
ひっかけ: 「複数のオーバーロードに解決可能だから曖昧でコンパイルエラー」と考えがちだが、拡大変換の距離が最も近いものが一意に選ばれるため曖昧にはならない。オートボクシング(byte→Byte等)や可変長引数はさらに優先度が低く、拡大変換で解決できる限りそちらが優先される。
コマンド例と想定される挙動(未実行)
出力:
int
AIが作成し、別の手順のAIで誤りを点検した解説です(有資格者による監修は経ていません)

この問題集の作り方

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