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

mos*_*cro 6 java android variadic-functions

这应该是一个相当简单的问题.我环顾四周,找不到有关此语法的任何主题,而"..."使得在Google上搜索变得困难.我正在开发一个简单的测试应用程序,用于将数据库文件从未植根的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) {
Run Code Online (Sandbox Code Playgroud)

我以前从未见过这个论点final String... args.这是什么意思/做什么?

谢谢!Moscro

Nis*_*ant 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}).