Java Varargs和无参数方法
我刚刚赶上Java1.5(是的,我知道它太早了;)。当我在varargs上尝试一些练习时,我发现了一些奇怪的事情,如下所示。代码编译得很好,只有在我提供至少一个参数时才会调用varargs方法。这不应该是一个编译器错误,一个使用varargs的方法和重载方法。或者您是否认为有任何特定的用例,此场景将 有用Java Varargs和无参数方法,java,variadic-functions,Java,Variadic Functions,我刚刚赶上Java1.5(是的,我知道它太早了;)。当我在varargs上尝试一些练习时,我发现了一些奇怪的事情,如下所示。代码编译得很好,只有在我提供至少一个参数时才会调用varargs方法。这不应该是一个编译器错误,一个使用varargs的方法和重载方法。或者您是否认为有任何特定的用例,此场景将 有用 public class VarargsExample { public static void main(String args[]) { test1();
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:尝试在中搜索此内容,但找不到类似的内容。如果已经有了,请原谅:)
总结,感谢大家的快速回复。似乎正常的方法是首选的方法之一。如下所示,当存在单个参数方法时,情况也是如此
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)");
}
}
首先调用参数less重载,因为它的签名比用varargs覆盖的签名更具体。通常,让两个重载方法执行完全不同的操作是一个非常糟糕的主意。因此,假设无参数方法在无参数调用时与varargs方法做相同的事情,也就是说,无参数方法是varargs方法的特化 下面是一个用例。调用varargs方法始终需要创建数组。虽然,一开始我当然不会考虑太多这样的小优化,但在某些情况下(例如在紧循环中),这是一种可能相当大的开销。该方法的无参数版本不需要创建数组,另外还可能包含针对特定情况的其他优化 有时,您会看到多个专门化,一个没有参数,一个有一个,一个有两个,以及一个通用方法。例如:
void doSomething() { ... }
void doSomething(String a1) { ... }
void doSomething(String a1, String a2) { ... }
void doSomething(String... as) { ... }
但是我建议只在开发的后期才这样做,如果有的话。首先调用参数less重载,因为它的签名比覆盖varargs的签名更具体。通常,让两个重载方法执行完全不同的操作是一个非常糟糕的主意。因此,假设无参数方法在无参数调用时与varargs方法做相同的事情,也就是说,无参数方法是varargs方法的特化 下面是一个用例。调用varargs方法始终需要创建数组。虽然,一开始我当然不会考虑太多这样的小优化,但在某些情况下(例如在紧循环中),这是一种可能相当大的开销。该方法的无参数版本不需要创建数组,另外还可能包含针对特定情况的其他优化 有时,您会看到多个专门化,一个没有参数,一个有一个,一个有两个,以及一个通用方法。例如:
void doSomething() { ... }
void doSomething(String a1) { ... }
void doSomething(String a1, String a2) { ... }
void doSomething(String... as) { ... }
但是我建议只在开发的后期才这样做,如果有的话。首先调用参数less重载,因为它的签名比覆盖varargs的签名更具体。通常,让两个重载方法执行完全不同的操作是一个非常糟糕的主意。因此,假设无参数方法在无参数调用时与varargs方法做相同的事情,也就是说,无参数方法是varargs方法的特化 下面是一个用例。调用varargs方法始终需要创建数组。虽然,一开始我当然不会考虑太多这样的小优化,但在某些情况下(例如在紧循环中),这是一种可能相当大的开销。该方法的无参数版本不需要创建数组,另外还可能包含针对特定情况的其他优化 有时,您会看到多个专门化,一个没有参数,一个有一个,一个有两个,以及一个通用方法。例如:
void doSomething() { ... }
void doSomething(String a1) { ... }
void doSomething(String a1, String a2) { ... }
void doSomething(String... as) { ... }
但是我建议只在开发的后期才这样做,如果有的话。首先调用参数less重载,因为它的签名比覆盖varargs的签名更具体。通常,让两个重载方法执行完全不同的操作是一个非常糟糕的主意。因此,假设无参数方法在无参数调用时与varargs方法做相同的事情,也就是说,无参数方法是varargs方法的特化 下面是一个用例。调用varargs方法始终需要创建数组。虽然,一开始我当然不会考虑太多这样的小优化,但在某些情况下(例如在紧循环中),这是一种可能相当大的开销。该方法的无参数版本不需要创建数组,另外还可能包含针对特定情况的其他优化 有时,您会看到多个专门化,一个没有参数,一个有一个,一个有两个,以及一个通用方法。例如:
void doSomething() { ... }
void doSomething(String a1) { ... }
void doSomething(String a1, String a2) { ... }
void doSomething(String... as) { ... }
但是我建议只在开发的后期才这样做,如果有的话。@Pshemo谢谢你格式化代码。是什么让你认为这应该失败?@christopher我从来没有说过它会失败。没问题。顺便说一句,由于缺少参数,
test1()
比test1(int…x)
更精确,所以我想不出编译器为什么不应该在varargs上使用它…@Ravisha:编译器“首选”非vararg方法而不是vararg方法。一旦将第一个int参数添加到方法调用中,就会调用vararg版本。如果您不知道要使用的参数的确切数目,Vararg方法可能非常有用。示例:@Pshemo谢谢你格式化代码。你为什么认为这应该失败?@christopher我从来没有说过它会失败。没问题。顺便说一句,基于缺少参数<代码