2013-06-04 101 views
4

为什么下面不返回整数列表?Arrays.asList返回类型不匹配混淆

int[] ints = new int[] { 1, 2, 3, 4, 5 }; 
List<Integer> intsList = Arrays.asList(ints); //compilation error 

但是,相反的int[]

虽然这

String[] strings = new String[] { "Hello", "World" }; 
List<String> stringsList = Arrays.asList(strings); 

返回列表中的String列表。我猜是因为它是一个原始数组而失败了,但为什么呢?我该如何返回一个int的列表。

+0

你只能在'List'中有'Object'。这排除了int列表。 –

+1

我希望它会被自动装箱。 – arynaq

+0

但列表给他一个编译错误。 – eternay

回答

2

TList<T>必须是java.lang.Object一些亚型,这int不是。唯一的解释是,因为我们使用的是...,所以您提供的是int[]的数组,即int[][]。所以你得到List<int[]>

StringObject的子类型,所以它按预期工作。在J2SE 5.0中引入可变参数之前,它也是唯一可行的方法。通常,现有代码的解释不应在语言版本之间改变。

现在,如果你想要一个List<Integer>你可以通过和框中的每个整数。如果程序中有很多这些元素,那么内存可能是一个问题。您可能希望使用第三方库,该库可使用int[]紧凑地支持List<Integer>,或者仅使用基元数组。不幸的是,Java不支持值类型。

7

这是因为Arrays.asList(new int[] { 1, 2, 3, 4, 5 })将创建一个List<int[]>与一个项目,而不是List<Integer>与五个项目。

不过请注意,这会做你所期望的:

List<Integer> intsList = Arrays.asList(1, 2, 3, 4, 5); 

你的其他选择是:

  • 在首位创建Integer[],或
  • 来填充列表一个循环
+0

是的,我已经尝试过,但它的工作,但与亿美元的int []? – arynaq

+0

@arynaq然后,你的两个选择是创建一个'Integer []'而不是'int []'或者在一个循环中填充你的列表。 – assylias

3

该方法被定义为: public static <T> List<T> asList(T... a)

因此,在您的第一种情况下,Tint[],并且您正在将单个对象传递给该方法(即,数组),因此它返回一个int[]的列表。

我觉得你与asList(1, 2, 3, 4, 5)(即5项)误

+0

没错。 +1记住。在Java中,如果你喜欢,你可以调用一个参数类型为T的类型为T的变量。这就是为什么签名很重要。 –

+0

在Java中没有'int'的'List'这样的东西。 –

+0

错字。固定。谢谢。 – mprivat