2011-09-04 104 views
0
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当他们的意思是数组? 对此有特殊意义吗?写`double ...`而不是`[] double`

回答

4

double...宣称这是一个“变参”的参数 - 你的方法里面的相同double[]但对于调用者,它更容易与不同的参数数目调用(因此VAR参数),而无需显式创建一个数组:

没有变参:

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

随着变参:

MonomialPolynomial(double... coeffs) { ...} 
... 
// array gets created implicitly, so less boilerplate code 
new MonomialPolynomial(1, 2, 3); 

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

foo(int a, int b...)是unambigious,因为第一个参数总是会之后被分配到a和任何将进入的b。如果意味着a={1} and b={2, 3}a={1, 2} and b={3}

+1

请注意,数组的创建无论如何都是隐式完成的 –

+0

是的,这只是调用方便 - 我编辑了代码块注释,谢谢:) –

0

这是vararg功能,也就是函数获取的所有参数都被收集到一个数组中。在那种情况下,一组双打。该功能用于硬编码数组等。如果MonomialPolynomial要接受一个double[],你将不得不使用这种oneliners:

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

但随着变量参数,你可以写一点整洁代码:

MonomialPolynomial(1, 2, 3); 
+0

Err ...与f(double,...)相同吗?逗号是可选的吗? –

+0

@Kerrek,对不起..? – progo

+0

你可能会对从'int'到'double'发生的automagic扩展转换感到困惑 - 在Java中,你可以将任何“更小”的数据类型赋值为“更大”的类型。因此,因为int很好地适合于double,所以编写新的double [] {...',然后只放置int,这些都是没有问题的 - 它们都会被扩大为double。 –

1

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

相关问题