Java Varargs和无参数方法

Java Varargs和无参数方法,java,variadic-functions,Java,Variadic Functions,我刚刚赶上Java1.5(是的,我知道它太早了;)。当我在varargs上尝试一些练习时,我发现了一些奇怪的事情,如下所示。代码编译得很好,只有在我提供至少一个参数时才会调用varargs方法。这不应该是一个编译器错误,一个使用varargs的方法和重载方法。或者您是否认为有任何特定的用例,此场景将 有用 public class VarargsExample { public static void main(String args[]) { test1();

我刚刚赶上Java1.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:尝试在中搜索此内容,但找不到类似的内容。如果已经有了,请原谅:)

总结,感谢大家的快速回复。似乎正常的方法是首选的方法之一。如下所示,当存在单个参数方法时,情况也是如此

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我从来没有说过它会失败。没问题。顺便说一句,基于缺少参数<代码