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

Jim*_*Jim 18 java variadic-functions

我不明白那种语法.试图谷歌各种单词加"......"是没用的.

Bal*_*usC 14

它被称为varargs.这个事实应该会产生更好的Google结果.

  • @Carlos:嗯,这就是为什么我回答它的原因. (5认同)

Mar*_*gus 12

这称为Variadic函数(wiki页面包含许多语言中的示例).

在计算机编程中,可变函数是不定的arity的函数,即接受可变数量的参数的函数.对可变参数函数的支持在编程语言中有很大差异.有许多数学和逻辑运算自然地作为可变函数出现.例如,数字的求和或字符串或其他序列的串联是可逻辑地应用于任何数量的操作数的操作.在许多语言中作为可变参数函数实现的另一个操作是输出格式.C函数printf和Common Lisp函数格式是两个这样的例子.两者都采用一个指定输出格式的参数,以及提供要格式化的值的任意数量的参数.可变函数可以在某些语言中暴露类型安全问题.例如,C的printf,如果不谨慎使用,可能会产生一类称为格式字符串攻击的安全漏洞.攻击是可能的,因为对可变函数的语言支持不是类型安全的; 它允许函数尝试从堆栈中弹出更多的参数而不是放在那里 - 破坏堆栈并导致意外行为.变量函数可以被认为是apply函数的补充,它将函数和列表/序列/数组作为参数,然后调用函数一次,参数是列表的元素.可以产生一类称为格式字符串攻击的安全漏洞.攻击是可能的,因为对可变函数的语言支持不是类型安全的; 它允许函数尝试从堆栈中弹出更多的参数而不是放在那里 - 破坏堆栈并导致意外行为.变量函数可以被认为是apply函数的补充,它将函数和列表/序列/数组作为参数,然后调用函数一次,参数是列表的元素.可以产生一类称为格式字符串攻击的安全漏洞.攻击是可能的,因为对可变函数的语言支持不是类型安全的; 它允许函数尝试从堆栈中弹出更多的参数而不是放在那里 - 破坏堆栈并导致意外行为.变量函数可以被认为是apply函数的补充,它将函数和列表/序列/数组作为参数,然后调用函数一次,参数是列表的元素.它允许函数尝试从堆栈中弹出更多的参数而不是放在那里 - 破坏堆栈并导致意外行为.变量函数可以被认为是apply函数的补充,它将函数和列表/序列/数组作为参数,然后调用函数一次,参数是列表的元素.它允许函数尝试从堆栈中弹出更多的参数而不是放在那里 - 破坏堆栈并导致意外行为.变量函数可以被认为是apply函数的补充,它将函数和列表/序列/数组作为参数,然后调用函数一次,参数是列表的元素.

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

一个例子是,当我构建一个泛型binary tree node,用于编码任务时,我在构造函数中使用了它.这使我能够简单地向树添加元素并分发它们.

继创建字符串类型的二进制树,根"Red"和2个分支"Blue""Green".

new MBTN<String>("Red", "Blue", "Green").
Run Code Online (Sandbox Code Playgroud)

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


Edw*_*uck 10

它们是"可变参数"或varargs(简称).

基本上它允许传递一个未指定数量的字符串,所以方法签名

public void printStuff(String...messages)
Run Code Online (Sandbox Code Playgroud)

有效地可以处理以下呼叫

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

您可以有效地将此视为一种自动装箱.该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"});
Run Code Online (Sandbox Code Playgroud)

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

...
if (messages != null) {
  for (String message : messages) {
    System.out.println(message);
  }
}
...
Run Code Online (Sandbox Code Playgroud)

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