2013-01-05 98 views
1

這是什麼意思?我不知道參數聲明的第一種方法m是什麼意思。與「array var-args」混淆作爲參數

它拒絕通過String,但允許一維數組String []和二維數組String[][]。它不允許[][][]或其他更多。

有人可以清除它嗎?

class j{ 
    public static void m(String [] ... a) { 
     System.out.println("Y"); 
    } 

    public static void main(String[] args) { 
     String [][] s = {}; 
     m(s); 
    } 
} 

謝謝。

回答

6

public static void m(String [] ... a)表示您的函數可以接受任意數量的String []作爲參數,並且在函數內您將有一個String [](即String [] [])數組作爲a的類型。您也可以直接傳遞一個String [] []而不是傳遞多個String []。

例如...

String [] x = {"a", "aa", "aaa"}; 
String [] y = {"b", "bb", "bbb"}; 
String [] z = {"c", "cc", "ccc"}; 

//All of these are valid uses of m(...). 
m(x); 
m(x,y); 
m(x,y,z); 

在每種情況下,m將有一個名爲a字符串的一個二維陣列。

此外,由於aString[][],您也可以直接傳遞一個String[][]

String[][] XYZ = {x,y,z}; 

//Also valid. Same behaviour as m(x,y,z); 
m(XYZ); 
+0

即使'm()'也是可能的。不要忽視這一點。 – ollo

1

有供應可變數量的類型T的參數您可以直接列出的分配轉換爲T表達的兩種方式,或者你可以提供一個單一的T []。

對於特定情況,這意味着您可以列出類型爲String []的表達式,或者提供一個String [] []。

1

這只是編譯器中的一些語法糖。

即:

ReturnType withVarArgs(ParamType... params) {} 

主要是等價於:

ReturnType noVarArgs(ParamType[] params) {} 

有以下區別:

  • 如果你有變量abParamTypec,您可以致電withVarArgs函數,其語法爲withVarArgs(a, b, c);您將不得不自己創建一箇中間陣列來調用變體。
  • 可變參數參數只能指定爲最後一個參數;
  • 正如Effective Java所指出的那樣,當您通過任何Object子類型的任何數組時,Object...Object[]的行爲將有所不同。,讓我們假設你想通過一個String[]):
    • 如果它與Object...一起使用,String[]數組對象將包裝在一個1元素的對象數組中;
    • 如果與Object[]一起使用,則將直接使用String[]數組對象,因爲Java中的數組對它們的元素類型是協變的;