Java方法的可变参数

177

有没有可能声明一个方法允许多个参数?

在定义中使用的符号是什么意思,表明该方法应该允许多个参数?

答案:可变参数(varargs)。


13
因为这是作业,我们不想知道你的问题,我们只想知道你正在学习。 - Dave
6个回答

313

没错。您可以在Oracle关于可变参数的指南中了解更多相关信息。

这是一个例子:

void foo(String... args) {
    for (String arg : args) {
        System.out.println(arg);
    }
}

可以称之为

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.

2
能否使用各种类型的参数?例如(String...strs,int...ints)。那么任何类型的参数以任何顺序传递呢? - trusktr
6
如果你想要任何对象,只需使用 Object... - BalusC
3
@trusktr,不,原始类型不是对象。这里有一个很好的解释区分它们的链接:http://www.programmerinterview.com/index.php/java-questions/difference-between-a-primitive-type-and-a-class-type/ - Dick Lucas
6
@Richard:使用 Object... args 可以与基本类型一起工作,因为有 自动装箱 - Sumit
你如何检查参数的数量? - Stevoisiak
1
@StevenVascellaro:我假设参数被处理成一个数组,所以你可以直接使用 varargs.length - Luatic

18

是的,这是可能的:

public void myMethod(int... numbers) { /* your code */ }

1
不够精确,无法理解。 - Bastien Gallienne

17
Variable number of arguments

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

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

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

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

源自 Oracle 认证 Java SE 7 程序员学习指南 2012 年版。


14

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

public void foo(Object... x) {
    String myVar1  = x.length > 0 ? (String)x[0]  : "Hello";
    int myVar2     = x.length > 1 ? Integer.parseInt((String) x[1]) : 888;
} 

然后称呼它

foo("Hii"); 
foo("Hii", 146); 

为了安全起见,请像这样使用:
if (!(x[0] instanceof String)) { throw new IllegalArgumentException("..."); }

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


6

0

是的,Java允许在方法参数中使用vargs

public class  Varargs
{
   public int add(int... numbers)int result = 1for(int number: numbers)
      {
         result= result+number;  
      }  return result; 
   }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接