在Java函数声明中,void... params的含义是什么?

13

最近我发现了一个Java代码片段。 函数定义的格式与我知道的迄今为止的不同。 以下是代码-

  protected Void doInBackground(String... params) {
        Log.i(TAG, "doInBackground");
        //Invoke web method 'PopulateCountries' with dummy value
        invokeJSONWS("dummy","PopulateCountries");
        return null;
    }

并且在参数中有一个类似于...的函数

protected void onProgressUpdate(Void... values) {
        Log.i(TAG, "onProgressUpdate");
    }
在下文中,... 的意思是什么?

可能是[这个方法签名中的省略号(...)是什么意思?]的重复问题。(https://dev59.com/6XE95IYBdhLWcg3wUMHW) - Ken Wolf
6个回答

28
在下面的上下文中,“...”是什么意思?
这在你想要使用类型为String的参数调用方法但又不知道要传递多少个参数时指定了可变长度的参数。
因此,您可以向方法传递任意数量的String
所以,您可以通过以下方式调用方法。
public void met(String...a)

你可以通过以下方式调用此方法

ob.met()
ob.met("a")
ob.met("a","b")

等等其他内容。

您可以在这里阅读更多相关信息。


10

这里所说的varargs是指同一类型的任意数量的参数。您可以按索引访问它,就像访问数组一样。


4
type ... variableName
省略号(...)代表可变数量的参数,在下面的求和方法中有所体现。
static int sum (int ... numbers)
{
   int total = 0;
   for (int i = 0; i < numbers.length; i++)
        total += numbers [i];
   return total;
}

3

从Java 5.0开始,可以使用可选参数。只需要像下面这样声明函数:

public void doSomething(boolean...optionalFlag) {
    ...
}

现在您可以使用doSomething()doSomething(true)进行调用。

这是Java 1.5及以上版本中的“新功能”(不支持Java 1.4或更早版本)。


3

Android的AsyncTask是一种通用类型。

当您需要一个没有中间进度数据意义的异步任务时,您应该将其声明为MyTask extends AsyncTask<Something, Void, Something>,使用类Void作为Progress类型变量的规范,并且按照通常的泛型规则,如果您决定重写onProgressUpdate,您将不得不将其声明为onProgressUpdate(Void... values)

因此,Void...除了类型为Void的可变参数方法之外,没有其他含义。


1

它是可变长度参数


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