Java 重载varargs方法时的奇怪行为
通常,具有固定数量参数的方法优于具有可变数量参数的重载方法。但是,此示例的行为不同:Java 重载varargs方法时的奇怪行为,java,arrays,variadic-functions,overloading,Java,Arrays,Variadic Functions,Overloading,通常,具有固定数量参数的方法优于具有可变数量参数的重载方法。但是,此示例的行为不同: 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
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
的第三行使用一个参数调用该方法,该参数是一个包含两个元素的字符串[]。但这并不是用一个参数执行方法,而是执行varargs方法,就像我给它两个参数一样(这有点正常,因为它是一个数组)
现在的问题是:这应该发生吗?我是否发现bug或未记录的行为?它这样做有什么原因吗?
为什么我要这么做:我想做一个快捷方式来打印控制台,它既可以接受任意数量的参数(多行),也可以很好地打印数组和列表
这种情况会发生吗
对
我是否发现bug或未记录的行为
没有
这有什么原因吗
是的
在一个数组中必须传递多个参数,这仍然是事实,
但是varargs功能会自动执行并隐藏该过程。此外,,
它与先前存在的API向上兼容
当显式使用数组时,它仍然与varargs签名匹配。这样做的目的是,人们可以轻松地将数组参数切换到varargs,而不会破坏现有的集成点
这与
main
可以是String[]
或String…
的原因完全相同,但它也使用一个参数匹配方法的签名。那么为什么不调用这个方法呢?因为varargs方法更具体,最具体的方法总是被选择的方法。根据您的用例,除了varargs之外,您并不真正需要单参数方法。不,正如您所看到的,它为print(1)
选择单参数方法,为print(1,2)
选择双参数方法,而不是varargs方法。从逻辑上讲,它们更具体:它们指定了参数的数量,并且适用于较少的情况。