写`double ...`而不是`[] double`

时间:2011-09-04 15:13:14

标签: java arrays

public MonomialPolynomial(double... coeffs){
    List<IMonom> monoms = new ArrayList<IMonom>();

    for (int i = 0; i < coeffs.length; i++) {
        // zero coeffs might yaffect the degree
        if(coeffs[i] != 0)
            monoms.add(new Monom(coeffs[i], i));
    }

    super.monoms = monoms;
}

为什么人们在表达数组时会写double...而不是[] double? 对此有特殊意义吗?

3 个答案:

答案 0 :(得分:4)

double...声明它是一个“var args”参数 - 在你的方法中它与<{1}} 相同但是对于调用者来说,用调用它会容易得多不需要显式创建数组的不同数量的参数(因此是var args):

没有var args:

double[]

使用var args:

MonomialPolynomial(double[] coeffs) { ...}
...
// explicit array creation necessary
new MonomialPolynomial(new double[] {1, 2, 3)};

编辑:要注意var args,只有方法的最后一个参数可以是var args参数。这保证了在调用方法时没有歧义,例如

MonomialPolynomial(double... coeffs) { ...} ... // array gets created implicitly, so less boilerplate code new MonomialPolynomial(1, 2, 3); 是不明确的,因为第一个参数将始终分配给foo(int a, int b...),之后的任何内容都会进入a

另一方面,

b是暧昧的,没有办法判断foo(int a..., int... b)foo(1, 2, 3)还是a={1} and b={2, 3}

答案 1 :(得分:1)

double...是一个varargs(可变参数)功能。这意味着您可以为构造函数提供double的数组,或者您可以为构造函数提供任意数量的double,并将它放入数组中。 (例如:MonomialPolynomial(1.0, 5.0, 6.0)。)

答案 2 :(得分:0)

它是vararg特性,即函数获取的所有参数都被收集到一个数组中。在这种情况下,一系列双打。该功能适用​​于硬编码阵列等。如果MonomialPolynomial要接受double[],则必须使用此类oneliners:

MonomialPolynomial(new double[] {1, 2, 3});

但是使用变量参数,你可能会编写一些更简洁的代码:

MonomialPolynomial(1, 2, 3);