2016-03-05 143 views
0

我對Java Collections並不陌生,但我對以下場景感到困惑。爲什麼方法'Arrays.asList()'不接受{「」,「」}類型的參數,但接受(「」,「」)?

在我的項目,我實現了一個這樣的代碼:

List<String> obj_lStr= new ArrayList<String>(); 
String[] obj_arrStr = {"someString", "noString", "abcString"}; 
obj_lStr.addAll(Arrays.asList(obj_arrStr)); 

但在代碼審查我的項目負責人給我的指令來改變這種代碼並執行它,而無需使用String[] obj_arrStr

然後,我改變了我的代碼如下:

obj_lStr.addAll(Arrays.asList({ "someString", "noString", "abcString" })); 

但我得到了編譯錯誤:

Main.java:13: error: illegal start of expression 
    x.addAll(Arrays.asList({"someString", "noString", "abcString"})); 
         ^
Main.java:13: error: ')' expected 
    x.addAll(Arrays.asList({"someString", "noString", "abcString"})); 
          ^
Main.java:13: error: ';' expected 
    x.addAll(Arrays.asList({"someString", "noString", "abcString"})); 

,我改變我的代碼行這樣:

obj_lStr.addAll(Arrays.asList("someString", "noString", "abcString")); 

然後編譯錯誤消失了。

問:爲什麼會這樣?爲什麼asList()方法會產生一個編譯錯誤{"","",""},但不是("","","")

+1

試着通過閱讀https://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#asList%28T...%29來了解它。 – nnunes10

+1

'{...}'用於數組初始化,'asList(T ...)'需要'var-args',這意味着你實際上不是傳遞一個數組,而是一系列形成數組的對象序列。 – StepTNT

回答

3

asList()簽名有答案:public static <T> List<T> asList(T... a)

它需要一個可變參數,所以obj_lStr.addAll(Arrays.asList("someString", "noString", "abcString"));編譯bcoz你的論點將變成一個數組。

但在這裏obj_lStr.addAll(Arrays.asList({ "someString", "noString", "abcString" }));,您需要指定數組的類型。所以你可以這樣做:obj_lStr.addAll(Arrays.asList(new String[] { "someString", "noString", "abcString" }));

數組的初始化{}僅語法期間動初始化可用,爲前:

int[] a ={1,2,4}; // works 

int[] a new int[3]; 
a = {1,2,4}; // doesn't work 
+0

明顯的解釋謝謝:)。 –

0

這只是與在Java代碼中,由於你可以省略類型和允許陣列做推斷 - 特別是,你只能使用array = {foo, bar...}當你直接分配到合適類型的數組,而不是你將它傳遞到其他地方的地方。

在任何情況下,你應該寫爲

Arrays.asList("someString", "noString", "abcString") 

沒有{}括號可言。

4

Arrays.asList將數組或數組的所有元素作爲參數。

所以,你需要或者

Arrays.asList(new String[]{"someString", "noString", "abcString"}) 

Arrays.asList("someString", "noString", "abcString") 
0

您可以養活一個字符串數組Arrays.asList

Arrays.asList(new String[] {"a","b","c"}); 

或多個字符串(varags)

Arrays.asList("a","b","c"); 

但僅僅

Arrays.asList({"a","b","c"}); 

心不是工作,爲{"a","b","c"}不代表對象的Java的

0

如果試圖在看javadocs ,你會了解到asList有簽名

public static <T> List<T> asList(T... a) 

現在,參數聲明T... a使用了一個叫做variable arguments的java特性,它基本上意味着參數a可以是T型數組,也可以是所有類型爲T的對象序列。

希望有幫助。

相關問題