为什么方法'Arrays.asList()'不接受{“”,“”}类型的参数,但接受(“”,“”)?

时间:2016-03-05 16:32:11

标签: java arrays

我不是Java 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()方法会使用{"","",""}引发编译错误,而不是("","","")引发编译错误?

5 个答案:

答案 0 :(得分:4)

Arrays.asList接受数组或数组的所有元素作为参数。

所以你需要

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:0)

这与Java代码中的哪些地方有关,你可以省略类型并允许推断数组 - 具体来说,当你直接分配到一个数组中时,你只能使用array = {foo, bar...}适当的类型,而不是你在其他地方传递的地方。

无论如何,你应该写的是

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

根本没有{}个大括号。

答案 3 :(得分: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对象

答案 4 :(得分:0)

如果您尝试查看javadocs ,您将了解asList有签名

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

现在,参数声明T... a使用了一个名为variable arguments的java特性,这基本上只意味着参数a可以是T类型的数组,或者,它可以是T类型的所有对象序列。

希望有所帮助。