java - 可变参数和无参数方法

标签 java variadic-functions

我刚刚 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/

相关文章:

java - 将 RippleEffect Color 更改回其 Styled 原始值

java - 基本数组 - Java

java - Java 编译器如何为具有多个边界的参数化类型选择运行时类型?

java - 不明确的可变参数方法

c++ - 参数包扩展遇到问题

java - 如何使用 jni 指定可变数量的参数

java - 类似于 Java 的 OpenCart

java - 我可以在我的 Android 应用程序中定义动态 intent-filter 吗?

C++ 为什么 va_start 需要最后一个非可变参数函数参数?

C++11:Variadic模板函数参数包扩展执行顺序