Varargs 是一种特殊的语法,允许方法接受相同类型的不定(任意)数量的参数。在方法声明中,这种参数表示为 Type... name(例如,int... nums)。在方法内部,这些参数被视为普通数组。
示例:
public void printNumbers(int... nums) { for (int n : nums) { System.out.print(n + " "); } }
可以这样调用:
printNumbers(1, 2, 3, 4); // 或者 printNumbers();
内部实现: 调用带有varargs的方法时,编译器会自动创建相应类型的数组。
限制和细节:
printNumbers(null) 在尝试遍历时将引发NPE。问题:“是否可以声明多个varargs参数的方法?”
常见错误:许多人认为可以声明 public void example(int... a, String... b),但这将导致编译错误。
正确答案:不,只能有一个varargs参数,并且它必须是最后一个。
故事
在一个企业日志库中,实现了带有varargs和数组的重载方法。当传递数组而不是一组元素时,应用了错误的方法变体,导致数组被记录为对象而不是其内容。这在分析日志时造成了混淆。
故事
在一个集成服务中,调用带有varargs的方法时接受null而没有检查NPE。系统在尝试遍历元素时意外“崩溃”,因为预期至少是空数组。
故事
在一个电子商务项目中,他们在方法的重载中混淆了:有一个方法
send(String subject, String... emails)和另一个方法send(String subject, String[] emails)。传递数组时,编译器隐式选择了错误的方法。结果:邮件未发给客户。