我刚刚 catch java 1.5,(是的,我知道现在还太早;))。在尝试对 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)");
}
}
最佳答案
首先,无参数重载被调用,因为它的签名比使用可变参数的覆盖更具体。一般来说,使用两个执行完全不同操作的重载方法是一个非常糟糕的主意。因此,我们假设无参数方法在不带参数调用时与 varargs 方法执行相同的操作,即无参数方法是 varargs 方法的特化。
那么一个用例如下。调用 varargs 方法始终需要创建一个数组。虽然一开始我不会过多考虑这种小的优化,但在某些情况下(例如在紧密循环中),这种开销可能足够大。该方法的无参数版本不需要创建数组,此外还可能包含针对特定情况的其他优化。
有时,人们会看到不止一种特化,一种不带参数,一带一,一带二,以及一种通用方法。例如:
void doSomething() { ... }
void doSomething(String a1) { ... }
void doSomething(String a1, String a2) { ... }
void doSomething(String... as) { ... }
但我建议仅在开发的后期阶段这样做(如果有的话)。
关于java - 可变参数和无参数方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29445269/