【问题标题】:What do the 3 dots in Java generics mean? [duplicate]Java泛型中的三个点是什么意思? [复制]
【发布时间】:2013-07-11 11:40:15
【问题描述】:

例如我有这样的代码:(from here)

private class LongOperation extends AsyncTask<String, Void, String> {

      @Override
      protected String doInBackground(String... params) {}      

      @Override
      protected void onPostExecute(String result) {}

      @Override
      protected void onPreExecute() {}

      @Override
      protected void onProgressUpdate(Void... values) {
      }
}

方法参数中的3个点是做什么用的?

【问题讨论】:

  • 未定义的字符串类型参数个数?
  • 请注意,可变参数(可变参数)与泛型无关。
  • 与泛型无关。没有... 显式使用泛型类型的方法(因此可以简单地将它们视为仅使用非泛型类型)。确保对问题进行适当分类。
  • 好的,谢谢。认为是因为我只是看到它们与泛型有关

标签: java


【解决方案1】:

这三个点被称为varargs,在这里,您可以像这样将多个字符串传递给方法:

doInBackground("hello","world");
//you can also do this:
doInBackground(new String[]{"hello","world"});

Documentation on that here.

doInBackground 方法中,您可以枚举 varargs 变量 params,如下所示:

for(int i=0;i<params.length;i++){
    System.out.println(params[i]);
}

所以它基本上是doInBackground范围内的字符串数组

【讨论】:

  • 好的。以及如何访问这些字符串?就像一个数组?
  • @Simon 是的。事实上,在运行时它只是一个数组,甚至不是一个特殊的数组。 ... 的东西纯粹是编译时的语法糖。您甚至可以通过传递一个String[](或其他什么)而不是一堆Strings 来调用该方法,如this answer所示。
【解决方案2】:

编译器将三个点... 视为接收该对象的数组。在这种情况下StringVoid。你传入的对象数量就是数组的大小。

因此:

doInBackground("Hi", "Hello", "Bye") 将创建一个长度为 3 的 String 数组。

【讨论】:

  • so void 会生成一个 Object 类型的数组?
  • @Simon 不是void 这是Void 它是一个与您所想的void 不同的对象
  • 好的,像Void... objects这样的参数会和Object[] objects一样吗?
  • @Simon no Void 类与 Object 类不同。看stackoverflow.com/questions/643906/…
【解决方案3】:

这个概念被称为varargs,解释here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-26
    • 2012-08-13
    • 2017-04-28
    • 1970-01-01
    • 2012-07-15
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多