关于变量函数:Java中的3点…

Java, 3 dots in parameters

以下方法中的3个点是什么意思?

1
2
3
public void myMethod(String... strings){
    // method body
}

这意味着可以将零个或多个字符串对象(或它们的数组)作为该方法的参数传递。

请参见这里的"任意数量的参数"部分:http://java.xun.com /DOCS/Booo/Tudio/Java/javao/Talk。

在您的示例中,可以将其称为以下任意一种:

1
2
3
4
myMethod(); // Likely useless, but possible
myMethod("one","two","three");
myMethod("solo");
myMethod(new String[]{"a","b","c"});

重要提示:以这种方式传递的参数始终是一个数组-即使只有一个。确保在方法体中以这种方式处理它。

重要提示2:获取...的参数必须是方法签名中的最后一个。所以,myMethod(int i, String... strings)是可以的,但myMethod(String... strings, int i)是不可以的。

感谢瓦什在评论中的澄清。


这个特性被称为VARARGS,它是Java 5中引入的一个特性。这意味着函数可以接收多个String参数:

1
2
3
myMethod("foo","bar");
myMethod("foo","bar","baz");
myMethod(new String[]{"foo","var","baz"}); // you can even pass an array

然后,可以使用Stringvar作为数组:

1
2
3
4
5
6
7
8
9
10
public void myMethod(String... strings){
    for(String whatever : strings){
        // do what ever you want
    }

    // the code above is is equivalent to
    for( int i = 0; i < strings.length; i++){
        // classical for. In this case you use strings[i]
    }
}

这个答案很大程度上借鉴了基斯瓦和洛伦佐的…也来自于笔架的评论。


(P)It's Varargs:(p)(P)The varargs short for variable-length arguments is a feature that allows the method to accept variable number of arguments(Zero or more).有了这些变量,就可以简单地制定出一种方法,用以确定一个变量的数值。The feature of variable argument has been added in Java 5.(p)(P)Varargs Syntax of(p)(P)a vararg is secified by three ellipsis(three dots)after the data type,its general form is(p)字母名称(P)瓦拉尔格斯(p)(P)Prior to Java 5,in case there was a need of variable number of arguments,there were two ways to handle it(p)(P)如果最大数量的Arguments,一种方法可以被认为是小的和已知的,那么这些方法可以被创造出来。如果最大限度地使用一种方法可能会使这些方法大或/或不为人所知,那么这些方法是为了采用一种方法,将这些方法纳入一项条款,并通过这些条款,使之成为一种方法。这些2种方法都是错误的——无论何时和如何困难地——建立起一个参数阵列——作为新的争论的补充,可能会导致新的总论方法的产生。(p)(P)Varargs的优势(p)(P)Offers a much simpler option.《未经编辑的方法》不需要写作。(p)(P)Example of Varargs(p)字母名称(P)它可以从方案中看到,Length在这里被用来确定通过该方法的Arguments number。这是可能的,因为Varargs是暗示通过作为一个Array。Whatever arguments are passed as varargs are stored in an array which is referred by the name given to varargs.在这个程序中,Array的名称是价值。Also note that method is called with different number of argument,first call with four arguments,these three arguments and then with zero arguments.所有这些叫声都是由采用Varargs的同一种方法掌握的。(p)(P)限制与枝条(p)(P)It is possible to have other parameters with varargs parameter in a method,however in that case,varargs parameter must be the last parameter declared by the method.(p)字母名称(P)Another restriction with varargs is that there must be only one varargs parameter.(p)字母名称(P)Overloading varargs methods(p)(P)这是一种可能的方法,可以采取Varargs Parameter。Varargs method can be overloaded by-(p)(P)其vararg parameter的类型可能不同。另一个参数。举例来说,溢出梯子方法(p)字母名称(P)Varargs and overloading模棱两可(p)(P)在一些案件中,尽管我们采用了不同的方法,但仍有含糊不清的情况。让我们看看一个例子(p)字母名称(P)In this program when we make a call to displaydata(……)method without any parameter it throws mistake,because compiler is not sure whether this method call is for EDOCX1(p)(P)Same way if we have overloaded methods where one has the EDOCX1 universifical 2 method of one type and another method has one parameter and EDOCX1 universal 2.Parameter of the same type,they also we have the模棱两可-AS EXP-字母名称(p)(P)这两种方法将始终是模棱两可的。(p)


这是通过VARARGS(变量数参数)的Java方式。

如果您熟悉C,这类似于使用它的...语法printf函数:

1
int printf(const char * format, ...);

但是以类型安全的方式:每个参数必须符合指定的类型(在您的示例中,它们都应该是String)。

以下是如何使用varargs的简单示例:

1
2
3
4
5
6
7
8
9
10
11
12
class VarargSample {

   public static void PrintMultipleStrings(String... strings) {
      for( String s : strings ) {
          System.out.println(s);
      }
   }

   public static void main(String... args) {
      PrintMultipleStrings("Hello","world");
   }
}

...参数实际上是一个数组,因此可以将String[]作为参数传递。


可以说,它是一个语法甜头的例子,因为它无论如何都是作为一个数组实现的(这并不意味着它是无用的),我更喜欢传递一个数组来保持它的清晰,并用给定类型的数组声明方法。不过,与其说是一种意见,不如说是一种回答。


此外,要想让您了解一些情况,重要的是要知道var arg参数仅限于一个,并且不能有多个var art参数。例如,这是非法的:

1
2
3
public void myMethod(String... strings, int ... ints){
// method body
}


如果你来自这个背景,就把它当作c中的关键词params:)


(P)字母名称6(p)字母名称


在Android AsyncTask中最著名的一种方法中,有一种非常常见的方法可以清楚地看到三个点的用法(今天由于RxJava的使用不多,更不用说Google体系结构组件了),您可以找到成千上万个搜索这个术语的示例,以及理解和不了解该术语的最佳方法。三个点的意思是它们表达了一种…怀疑…就像普通语言一样。也就是说,不清楚必须传递的参数个数,可以是0,可以是1,可以是更多(数组)。