方法的Java变量号或参数

use*_*514 137 java methods arguments parameter-passing variadic-functions

是否可以声明一个允许可变数量参数的方法?

定义中使用的符号是什么,表明该方法应该允许可变数量的参数?

答案: varargs

Bal*_*usC 258

那是对的.您可以在varargs的Oracle指南中找到更多相关信息.

这是一个例子:

void foo(String... args) {
    for (String arg : args) {
        System.out.println(arg);
    }
}
Run Code Online (Sandbox Code Playgroud)

可称为

foo("foo"); // Single arg.
foo("foo", "bar"); // Multiple args.
foo("foo", "bar", "lol"); // Don't matter how many!
foo(new String[] { "foo", "bar" }); // Arrays are also accepted.
foo(); // And even no args.
Run Code Online (Sandbox Code Playgroud)

  • @trusktr:如果你想要任何对象,只需使用`Object ...`. (5认同)
  • @Richard:由于[autoboxing](https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html),使用`Object ... args`将与原语一起使用. (5认同)
  • 是否可以执行各种类型的参数?例如(字符串...strs,int...ints)。任何类型的任意顺序的论证又如何呢? (2认同)
  • @trusktr不,原语不是对象.这里有一个很好的解释:http://www.programmerinterview.com/index.php/java-questions/difference-between-a-primitive-type-and-a-class-type/ (2认同)

小智 15

Variable number of arguments
Run Code Online (Sandbox Code Playgroud)

可以将可变数量的参数传递给方法.但是,有一些限制:

  • 可变数量的参数必须都是相同的类型
  • 它们被视为方法中的数组
  • 它们必须是方法的最后一个参数

要了解这些限制,请考虑以下代码片段中的方法,该方法用于返回整数列表中的最大整数:

private static int largest(int... numbers) {
     int currentLargest = numbers[0];
     for (int number : numbers) {
        if (number > currentLargest) {
            currentLargest = number;
        }
     }
     return currentLargest;
}
Run Code Online (Sandbox Code Playgroud)

来源Oracle认证助理Java SE 7程序员学习指南2012


Dol*_*lph 13

是的,这是可能的:

public void myMethod(int...numbers) { ... }
Run Code Online (Sandbox Code Playgroud)


T.T*_*dua 8

对于不同类型的参数,有3个点:

public void foo(Object... x) {
    String first    =  x.length > 0 ? (String)x[0]  : "Hello";
    int duration    =  x.length > 1 ? Integer.parseInt((String) x[1]) : 888;
} 
Run Code Online (Sandbox Code Playgroud)

然后打电话给它

foo("Hii"); 
foo("Hii", 146); 
Run Code Online (Sandbox Code Playgroud)

为安全起见,使用如下:
if (!(x[0] instanceof String)) { throw new IllegalArgumentException("..."); }

这种方法的主要缺点是,如果可选参数属于不同类型,则会丢失静态类型检查.请看更多变化.