“...”在参数列表中的含义是什么? doInBackground(String ... params)

时间:2010-10-18 14:38:35

标签: java variadic-functions

我不懂语法。试图谷歌各种单词加“......”是没用的。

8 个答案:

答案 0 :(得分:14)

它被称为varargs。这个事实应该产生better Google results

答案 1 :(得分:12)

这称为Variadic function(维基页面上有很多语言的例子)。

  

在计算机编程中,一种可变的   功能是无限期的功能   arity,即接受a的人   可变数量的参数。支持   对于可变函数的广泛不同   在编程语言中。有   许多数学和逻辑   自然而然地发生的操作   作为可变函数。例如,   数字或数字的总和   串联或其他串联   序列是可以的操作   逻辑上适用于任何数量的   操作数。另有一个操作   已被实现为可变参数   输出多种语言的功能   格式。 C函数printf和   Common Lisp函数格式是   两个这样的例子。两者都拿一个   指定格式的参数   的输出,以及任何数量的   提供值的参数   格式化。变量函数可以   在某些方面暴露了类型安全问题   语言。例如,C的printf,   如果使用不当,可以引起   一类被称为安全漏洞的安全漏洞   格式字符串攻击。攻击是   可能因为语言支持   对于可变函数不是   类型安全的;它允许功能   试图弹出更多的论点   堆栈比放在那里 -   破坏堆栈并导致   意外行为。可变参数   功能可以考虑   补充应用功能,   它需要一个功能和一个   list / sequence / array作为参数和   然后调用函数一次,用   论证是其中的要素   列表。

可能个人喜欢中的一个未使用 Java 中的功能。它基本上是一个由元素构建的引用数组。使用它的最好方法之一是在类构造函数或方法中,您需要不断地找到最多2,3,4,5个输入元素的值。

一个例子是,当我为编码任务构建通用binary tree node时,我在构造函数中使用了它。这使我只需将元素添加到树中并分发它们。

以下创建字符串类型二叉树,其中包含根"Red"和2个分支"Blue""Green"

new MBTN<String>("Red", "Blue", "Green").

你能想到替代方案会是什么:D你甚至不能简单地制作通用的元素数组,所以这会像地狱一样延伸。这绝对没有用。

答案 2 :(得分:10)

它们是“可变参数”或varargs(简称)。

基本上它允许传递未指定数量的字符串,因此方法签名

public void printStuff(String...messages)

有效地可以处理以下电话

printStuff("hi");
printStuff("hi", "bye");
printStuff("Hello", "How are you?", "I'm doing fine.", "See you later");

您可以有效地将此视为一种自动装箱。 printStuff参数可以看作是一个数组,因此printStuff(String...messages)在概念上像printStuff(String[] messages)一样处理。上面的调用有效地表现得像

printStuff(new String[] {"hi"});
printStuff(new String[] {"hi", "bye"});
printStuff(new String[] {"Hello", "How are you?", "I'm doing fine.", "See you later"});

要在内部访问消息,请使用典型的List处理原语。像

这样的东西
...
if (messages != null) {
  for (String message : messages) {
    System.out.println(message);
  }
}
...

随着自动装箱的出现,没有必要真正创建数组是Java添加了一些语法糖。

答案 3 :(得分:3)

正如@BalusC所提到的,它是一个varags参数。这意味着您可以将可变数量的参数传递给该方法。

因此对于定义为

的方法
public void foo(String...strings) {  }

以下调用是合法的:

foo();
foo("one param");
foo("one", "two", "three");

答案 4 :(得分:1)

它们是可变长度参数。

以下是example.

的一个链接

答案 5 :(得分:1)

正如大家所提到的......变量参数(或varargs)允许你这样做....

//Method we're using for varargs
public void doSomething(String... datas) {
    if (datas == null || datas.length == 0) {
        System.out.println("We got nothing");
    } else {
        for (String data: datas) {
            System.out.println(data);
        }
    }
}

因此,下面提到的所有这些电话都是有效的....

String d[] = {"1", "2", "3"};
doSomething(d); //An array of String, as long as the type is exactly as the varargs type.

//OR
doSomething("1", "2", "3", "4"); //I can add "infinitely" many arguments as the JVM can allocate me....

//OR 
doSomething("1"); //Exactly 1;

内部varargs“基本上”是它声明类型的引用数组。

答案 6 :(得分:0)

这是一个采用任意可变数量参数的java方法

答案 7 :(得分:0)

这意味着“任意数量的参数”意味着您可以将未知数量的参数传递给方法。

http://download.oracle.com/javase/tutorial/java/javaOO/arguments.html 查找“任意数量的参数”部分

public Polygon polygonFrom(Point... corners) {
    int numberOfSides = corners.length;
    double squareOfSide1, lengthOfSide1;
    squareOfSide1 = (corners[1].x - corners[0].x)*(corners[1].x - corners[0].x) 
            + (corners[1].y - corners[0].y)*(corners[1].y - corners[0].y) ;
    lengthOfSide1 = Math.sqrt(squareOfSide1);
    // more method body code follows that creates 
    // and returns a polygon connecting the Points
}