变长参数方法在重载匹配中优先级最低,仅当第一阶段(完全一致类型)和第二阶段(拓宽、装箱、继承转换)均无匹配时才启用;与数组参数共存时优先精确匹配数组;混用易致歧义编译失败。

变长参数方法在重载匹配中优先级最低,排在所有其他匹配方式之后。
三阶段匹配规则中它属于最后兜底选项
Java编译器按严格顺序筛选重载方法:
- 第一阶段:只接受完全一致的类型,不发生任何转换(如传 int 就必须匹配 int 参数)
- 第二阶段:允许基本类型拓宽(如 byte → int)、装箱拆箱(如 int → Integer)、子类转父类(如 String → Object)
- 第三阶段:仅当以上两阶段都无可用方法时,才考虑带 ... 的变长参数版本
即使变长参数看起来“更贴切”,也不会跳过前两阶段
例如同时存在:
- void log(String msg)
- void log(String msg, Object... args)
调用 log("hi") 会选第一个固定参数版本,而不是第二个——尽管后者语法上也能接收单个参数。
只有像 log("hi", 1, "a", true) 这样参数个数超出固定签名时,才会启用变长参数。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
和数组参数并存时,编译器倾向精确匹配数组
若定义了:
- void process(String[] arr)
- void process(String... args)
则:
- process(new String[]{"x", "y"}) → 匹配 String[] 版本
- process("x", "y") → 匹配 String... 版本
- process() → 只能匹配 String...(因为 String[] 不接受零参数)
重载中混用变长参数容易引发歧义
以下写法会导致编译失败:
- void f(int x, String... rest)
- void f(String... rest)
调用 f("a") 时,两个方法都能通过第三阶段匹配,编译器无法判定哪个更具体,直接报错。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










