2011-09-04 100 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)

相關問題