【问题标题】:Varargs and argument less method可变参数和无参数方法
【发布时间】:2015-04-04 10:22:57
【问题描述】:

我刚刚赶上 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)");
 } 

}  

【问题讨论】:

  • @Pshemo 感谢您格式化代码。
  • 是什么让你认为这应该失败?
  • @christopher 我从来没有说过它会失败。
  • 没问题。顺便说一句,基于缺少参数test1()test1(int... x) 更精确,所以我不认为编译器不应该在可变参数上使用它的任何原因......
  • @Ravisha:编译器“首选”非可变参数方法而不是可变参数方法。只要将第一个 int 参数添加到方法调用中,就会调用 vararg 版本。如果您不知道要使用的参数的确切数量,可变参数方法会非常有用。示例:Arrays.asList

标签: java variadic-functions


【解决方案1】:

首先,无参数重载被调用,因为它的签名比使用可变参数的 overlauding 更具体。拥有两个执行完全不同操作的重载方法通常是一个非常糟糕的主意。所以我们假设无参数方法在无参数调用时与可变参数方法做同样的事情,也就是说,无参数方法是可变参数方法的一个特化。

然后一个用例如下。调用可变参数方法总是需要创建一个数组。虽然,当然,起初我不会过多地考虑这样的小优化,但它是一种开销,在某些情况下(例如在紧密循环中),它可能足够大。该方法的无参数版本不需要创建数组,并且还可能包含针对特定情况的其他优化。

有时,一个人会看到多个专业化,一个没有参数,一个有一个,一个有两个,还有一个通用方法。例如:

void doSomething() { ... }
void doSomething(String a1) { ... }
void doSomething(String a1, String a2) { ... }
void doSomething(String... as) { ... }

但我建议仅在开发的后期才这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    • 2010-12-12
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 2013-05-13
    • 1970-01-01
    相关资源
    最近更新 更多