"final String... args" 这个语法是什么意思/作用?

7
这应该是一个非常简单的问题。我找了一下,没有发现任何关于这个语法的主题,并且“...”使得在Google上搜索变得困难。我正在开发一个简单的测试应用程序,用于将数据库文件从未root的Android手机上受保护的位置复制到SD卡上的一个位置,以便我可以使用sqlite3数据库查看工具进行查看。我知道这似乎是一个绕路的方法,但模拟器拒绝在我的净书上打开,所以我现在正在使用我的手机进行开发测试。
代码已经编写好了,所以我正在从这里借用它并将其适应我的代码。我遇到了这段小代码片段:
private class ExportDatabaseFileTask extends AsyncTask<String, Void, Boolean> {
  private final ProgressDialog dialog = new ProgressDialog(ManageData.this);

  // can use UI thread here
  protected void onPreExecute() {
     this.dialog.setMessage("Exporting database...");
     this.dialog.show();
  }

  // automatically done on worker thread (separate from UI thread)
  protected Boolean doInBackground(final String... args) {

我从未见过参数final String... args,这是什么意思/作用?
谢谢! Moscro
2个回答

11
在Java中,参数中的省略号表示类型的可变参数。因此,在您的情况下,"..."表示您可以将任意数量的字符串参数传递给doInBackground方法。
所以,您可以调用这个方法doInBackground("String1", "String2", "String3")或者doInBackground("String1")或者doInBackground("String1", "String2", "String3", "String4")或者其他任何形式。
请参阅http://download.oracle.com/javase/1.5.0/docs/guide/language/varargs.html 引用如下:
“最后一个参数类型后面的三个点号表示最后一个参数可以作为数组或一系列参数传递。Varargs只能在最后一个参数位置使用。给定MessageFormat.format的新varargs声明,上述调用可以被以下更短、更甜美的调用所替代。”
而"final"则具有其通常的含义。顺便说一句,这个特性只在Java5或更新版本中可用。
请参阅http://www.developer.com/java/other/article.php/3323661

正如上面两个链接所提到的,它只是一个含糖的数组。基本上,当你定义myMethod(T... vararg)时,Java会将其视为myMethod(T[] vararg)。当你调用myObj.myMethod(t1, t2, t3, ..., tn)时,Java会将其传递为myObj.myMethod(new T[]{t1, t2, t3, ..., tn})


4
final意味着argsdoInBackground中不可重新分配。 String...是一个“可变参数”。您可以将任何数量的String对象传递给doInBackground方法。 String...实际上是一个String[],它确实是一个String数组,并且可以像访问数组一样进行访问。

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