メソッド(オーバーロード解決=最小の暗黙拡大変換が優先)難易度 高無料
次のコードの出力として正しいものを選べ。
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 }
- A
int - B
long - C
double - Dコンパイルエラー(
f(byte)が複数の候補と曖昧になる)
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済
解説
byte 型の実引数に対して f(int)・f(long)・f(double) のいずれも暗黙の拡大変換(widening)で呼び出し可能であり、複数のオーバーロードが候補になる。
このように複数の候補がある場合、コンパイラは最も小さい(変換段階の少ない)拡大変換で到達できるオーバーロードを優先する。
プリミティブの拡大変換の順序は byte → short → int → long → float → double。
byte から最も近い(変換1段階)候補は int であり、long・double はさらに遠い(変換段階が多い)。
よってコンパイラは f(int) を選択し、出力は int になる。
- B
byteからintへの変換の方がlongへの変換より段階が少なく近い。より近いf(int)が優先される。 - C
doubleはbyte→short→int→long→float→doubleの中で最も遠い変換。他に近い候補(int)がある限り選ばれない。 - D拡大変換で到達できる候補が複数あっても、最も近い変換のオーバーロードが一意に決まるため曖昧エラーにはならない。
ひっかけ: 「複数のオーバーロードに解決可能だから曖昧でコンパイルエラー」と考えがちだが、拡大変換の距離が最も近いものが一意に選ばれるため曖昧にはならない。オートボクシング(
byte→Byte等)や可変長引数はさらに優先度が低く、拡大変換で解決できる限りそちらが優先される。コマンド例と想定される挙動(未実行)
出力: int
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)