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

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

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作成・独立検証済

解説

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

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

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

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