Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重载varargs方法时的奇怪行为_Java_Arrays_Variadic Functions_Overloading - Fatal编程技术网

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方法。从逻辑上讲,它们更具体:它们指定了参数的数量,并且适用于较少的情况。