语法“final String ... args”是什么意思/做什么?

时间:2011-02-26 05:04:26

标签: java android variadic-functions

这应该是一个相当简单的问题。我环顾四周,找不到有关此语法的任何主题,而“...”使得在Google上搜索变得困难。我正在开发一个简单的测试应用程序,用于将数据库文件从未植根的Android手机上的受保护位置复制到SD卡上我可以访问sqlite3 database viewing tool查看的位置。我知道这似乎是一种迂回的做事方式,但模拟器拒绝在我的上网本上打开,所以我现在正用手机测试开发。

代码已经写好,所以我borrowing it from here并将其调整到我的代码中。我遇到过这段代码:

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 个答案:

答案 0 :(得分:11)

Java中参数的省略号表示类型的 vararg 。因此,在您的情况下,...表示您可以将任意数量的String参数传递给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})传递。

答案 1 :(得分:4)

final表示无法在args中重新分配doInBackgroundString...是“vararg。”您可以将任意数量的String个对象传递给doInBackground方法。

String...实际上是String[] - 它实际上是String的数组,可以这样访问。