写`double ...`而不是`[] double`
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`
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}
。
这是vararg
功能,也就是函数获取的所有参数都被收集到一个数组中。在那种情况下,一组双打。该功能用于硬编码数组等。如果MonomialPolynomial
要接受一个double[]
,你将不得不使用这种oneliners:
MonomialPolynomial(new double[] {1, 2, 3});
但随着变量参数,你可以写一点整洁代码:
MonomialPolynomial(1, 2, 3);
Err ...与f(double,...)相同吗?逗号是可选的吗? –
@Kerrek,对不起..? – progo
你可能会对从'int'到'double'发生的automagic扩展转换感到困惑 - 在Java中,你可以将任何“更小”的数据类型赋值为“更大”的类型。因此,因为int很好地适合于double,所以编写新的double [] {...',然后只放置int,这些都是没有问题的 - 它们都会被扩大为double。 –
double...
是一个可变参数(可变参数)特征。这意味着您可以向构造函数提供一个double
的数组,或者您可以为构造函数提供任意数量的double
,并将其放入数组中。 (例:MonomialPolynomial(1.0, 5.0, 6.0)
)
请注意,数组的创建无论如何都是隐式完成的 –
是的,这只是调用方便 - 我编辑了代码块注释,谢谢:) –