重载varargs方法时的怪异行为

时间:2018-12-13 13:54:03

标签: 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){
  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>

1 个答案:

答案 0 :(得分:2)

  

这会发生吗?

  

我是否发现了错误或未记录的行为?

  

这样做有理由吗?

是的。 From Oracle

  

仍然必须在数组中传递多个参数,   ,但是可变参数功能会自动执行并隐藏该过程。此外,   与先前存在的API 向上兼容

当您显式使用数组时,它仍与varargs签名匹配。这样做是为了使人们可以轻松地将数组参数切换为varargs,而不会破坏现有的集成点。

main可以是String[]String...的完全相同的原因