首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

【Java 每日一題】可變參數方法重載解析:20161021 題目詳解

     編輯:Java 綜合教學

題目回顧

package Oct2016;
public class Ques1021 {
    public static void main(String[] args) {
        Ques1021 ques1021 = new Ques1021();
        ques1021.method01("test", 0);
        ques1021.method01("test", "tttt");
        ques1021.method01("test");
        ques1021.method01("test", null);
    }

    public void method01(String s, Integer... i) {}
    public void method01(String s, String... str) {}
}

編譯錯誤分析

程式碼無法編譯通過,原因在於第 3 次呼叫 ques1021.method01("test") 產生模糊匹配。

重載解析規則(JLS 15.12.2)

  1. 第一階段:不使用可變參數、自動裝箱/拆箱進行匹配。
  2. 第二階段:允許自動裝箱/拆箱,但不使用可變參數。
  3. 第三階段:允許可變參數匹配。

各呼叫匹配過程

呼叫匹配結果
method01("test", 0)Integer...:0 自動裝箱為 Integer,匹配可變參數 Integer...。String... 無法匹配 Integer。
method01("test", "tttt")String...:"tttt" 直接匹配 String...。Integer... 無法匹配 String。
method01("test")模糊匹配:兩個方法的可變參數部分均可接受零個引數,編譯器無法判斷選哪個,報錯 reference to method01 is ambiguous。
method01("test", null)模糊匹配:null 可匹配 Integer... 也可匹配 String...,同樣編譯失敗。

修正建議

  1. 避免同名方法使用不同型別的可變參數:重載方法簽名應在固定參數上區分,或僅保留一個可變參數版本。
  2. 顯式轉型消除模糊:呼叫時強制轉型 method01("test", (Integer[]) null) 或 method01("test", (String[]) null)。
  3. 改用集合參數:將可變參數改為 List<Integer>、List<String>,語義更清晰。

核心知識點總結

  • 可變參數本質是陣列,編譯期語法糖。
  • 重載解析優先固定參數,最後才考慮可變參數。
  • null 無型別,極易導致可變參數重載模糊。
  • 實務中盡量減少可變參數重載,改用集合或 Builder 模式。

Java每日一題二維碼

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved