我正在追赶java 1.5,(是的,我知道它太早了;))。在varargs上尝试一些练习时,我发现了一些奇怪的东西,如下所示。代码编译得很好,只有当我提供至少一个参数时才调用varargs方法。不应该是编译器错误,方法和使用varargs的重载方法。或者您可能会想到任何特定的用例,这种情况会 有用
public class VarargsExample {
public static void main(String args[]) {
test1();
}
public static void test1(int... x) {
System.out.println("AssertionExample.test1(ARRAY METHOD)");
}
public static void test1() {
System.out.println("AssertionExample.test1(PARAM LESS)");
}
}
PS:试图在SO中搜索,找不到类似的。请原谅我,如果已经有了:)
总结,感谢您的快速回复。似乎是正常的方法是首选。当单个参数方法存在时,情况也是如此
public class VarargsExample{
public static void main( String args[] ){
test1();
test1(2);
}
public static void test1(int... x){
System.out.println("AssertionExample.test1(ARRAY METHOD)");
}
public static void test1(int x){
System.out.println("AssertionExample.test1(single param METHOD)");
}
public static void test1(){
System.out.println("AssertionExample.test1(PARAM LESS)");
}
}
答案 0 :(得分:3)
首先调用无参数重载,因为它的签名比varargs的重叠更具体。一般来说,有两个重载方法执行完全不同的操作是一个非常糟糕的主意。因此,我们假设无参数方法与无参数调用时的varargs方法相同,即无参数方法是varargs方法的特化。
然后用例如下。调用varargs方法总是需要创建一个数组。虽然,首先,我不会过多地考虑这种微小的优化,但这是一种开销,在某些情况下(例如在紧密循环中)可能足够大。该方法的无参数版本不需要创建数组,另外还可以包含针对特定情况的其他优化。
有时,人们会看到一个以上的专业化,一个没有参数,一个有一个,一个有两个,一般方法。例如:
void doSomething() { ... }
void doSomething(String a1) { ... }
void doSomething(String a1, String a2) { ... }
void doSomething(String... as) { ... }
但我建议只在发展的后期才这样做,如果有的话。