簡體   English   中英

為什么方法'Arrays.asList()'不接受類型為{“”,“”}的參數,而是接受(“”,“”)?

[英]Why does method 'Arrays.asList()' not accept arguments of type {“”,“”}, but accepts (“”,“”)?

我對Java Collections並不Collections ,但是對以下情況感到困惑。

在我的項目中,我實現了如下代碼:

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()方法使用{"","",""}引發編譯錯誤,而不是("","","")

Arrays.asList采用一個數組或該數組的所有元素作為參數。

所以你需要

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

要么

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

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

它需要一個varargs,因此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

這與允許在Java代碼中的什么地方省略類型並允許推斷數組有關-特別是,當直接分配給一個array = {foo, bar...} ,只能使用array = {foo, bar...}適當類型的數組,而不是將其傳遞到其他地方的位置。

無論如何,你應該寫的是

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

根本沒有{}大括號。

您可以將字符串數組提供給Arrays.asList

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

或具有多個字符串(變量)

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

只是

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

不起作用,因為{"a","b","c"}並不代表Java對象

如果您嘗試查看javadocs ,則會發現asList具有簽名

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

現在,參數聲明T... a使用了Java的稱為可變參數的功能 ,這基本上意味着參數a可以是類型T的數組,也可以是所有類型的對象序列T.

希望能有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM