今日挑戰一道經典的方法重載解析題,考察基本類型與包裝類在重載解析中的優先級規則。這類問題常見於面試與認證考試,是驗證 Java 類型系統理解深度的優秀切入點。
package Nov2016;
public class Ques1130 {
public static void main(String[] args) {
int i = 1;
Ques1130.test(i);
Ques1130.test(Integer.valueOf(i));
}
public static void test(long n) {
System.out.println("調用基本類型的方法...");
}
public static void test(Long n) {
System.out.println("調用包裝類型的方法...");
}
}
Java 編譯器解析方法重載遵循嚴格的三階段策略(JLS §15.12.2),按優先級遞減:
關鍵原則: 基本類型之間的擴大轉換(widening)優先於裝箱;裝箱優先於可變參數;基本類型擴大不會直接轉為包裝類(即 int → long 可行,int → Long 不可行)。
Ques1130.test(i);:i 為 int。第一階段:int → long 屬擴大轉換,匹配 test(long)。輸出:調用基本類型的方法...Ques1130.test(Integer.valueOf(i));:參數為 Integer。第一階段:Integer 無法匹配 long(無拆箱)。第二階段:Integer 可拆箱為 int,但 int 仍需擴大為 long(不允許拆箱+擴大組合);直接匹配 test(Long) 只需身份轉換。輸出:調用包裝類型的方法...調用基本類型的方法...
調用包裝類型的方法...
若允許 Integer → int → long,則 Integer 同時匹配 test(long)(拆箱+擴大)與 test(Long)(身份),產生二義性。語言設計選擇「裝箱/拆箱不與基本類型擴大組合」以保證解析確定性。
@SuppressWarnings("overloads") 或靜態分析工具檢測可疑重載。題目來源:微信公眾號/簡書「Java每日一題」。掃描下方二維碼關注「老馬說編程」,每日一題,深入淺出,精進 Java 核心功力。