通常,带有固定数量参数的方法比带有可变数量参数的重载方法更可取。但是,此示例的行为有所不同:
public class Main{
public static void main(String[] args){
print(1);
print(1,2);
print(new String[]{"a","b"});
print(new String[][]{{"a","b"},{"c","d"}});
}
public static void print(Object object){
System.out.println("single argument method");
System.out.println(object);
}
public static void print(Object object0,Object object1){
System.out.println("two argument method");
System.out.println(object0);
System.out.println(object1);
}
public static void print(Object... objects){
System.out.println("varargs method with "+objects.length+" arguments");
for(Object object : objects){
System.out.println(object);
}
}
}
输出:
single argument method
1
two argument method
1
2
varargs method with 2 arguments
a
b
varargs method with 2 arguments
[Ljava.lang.String;@5e2de80c
[Ljava.lang.String;@1d44bcfa
main
的第三行使用一个参数调用该方法,该参数是带有两个元素的String []。但这并没有用一个参数执行该方法,而是执行了varargs方法并像我给它提供了两个参数一样进行操作(这是正常的,因为它是一个数组)。
现在是一个问题:这会发生吗?我是否发现了错误或未记录的行为?有这样做的原因吗?
为什么要这样做:我想为打印到控制台提供快捷方式,它既可以接受任意数量的参数(对于多行),也可以以一种很好的方式打印数组和列表。 / sub>
答案 0 :(得分:2)
这会发生吗?
是
我是否发现了错误或未记录的行为?
否
这样做有理由吗?
是的。 From Oracle:
仍然必须在数组中传递多个参数, ,但是可变参数功能会自动执行并隐藏该过程。此外, 与先前存在的API 向上兼容。
当您显式使用数组时,它仍与varargs签名匹配。这样做是为了使人们可以轻松地将数组参数切换为varargs,而不会破坏现有的集成点。
main
可以是String[]
或String...
的完全相同的原因